# ObserveError

VTKExamples/Cxx/Utilities/ObserveError

### Description

When vtk encounters an error or warning, by default the message is written to standard output. This example shows how to catch the error or warning. The example prints to standard output, but an application may wish to present the error or warning in a different manner, e.g. write to a log file or present the message in a window.

### Code

ObserveError.cxx

    #include <string>

    #include <vtkSmartPointer.h>
    #include <vtkImageData.h>
    #include <vtkCommand.h>

    class ErrorObserver : public vtkCommand
    {
    public:
      ErrorObserver():
        Error(false),
        Warning(false),
        ErrorMessage(""),
        WarningMessage("") {}
      static ErrorObserver *New()
      {
      return new ErrorObserver;
      }
      bool GetError() const
      {
      return this->Error;
      }
      bool GetWarning() const
      {
      return this->Warning;
      }
      void Clear()
      {
      this->Error = false;
      this->Warning = false;
      this->ErrorMessage = "";
      this->WarningMessage = "";
      }
      virtual void Execute(vtkObject *vtkNotUsed(caller),
                           unsigned long event,
                           void *calldata)
      {
      switch(event)
      {
        case vtkCommand::ErrorEvent:
          ErrorMessage = static_cast<char *>(calldata);
          this->Error = true;
          break;
        case vtkCommand::WarningEvent:
          WarningMessage = static_cast<char *>(calldata);
          this->Warning = true;
          break;
      }
      }
      std::string GetErrorMessage()
      {
      return ErrorMessage;
      }
    std::string GetWarningMessage()
    {
      return WarningMessage;
    }
    private:
      bool        Error;
      bool        Warning;
      std::string ErrorMessage;
      std::string WarningMessage;
    };

    int main (int, char *[])
    {
      vtkSmartPointer<ErrorObserver>  errorObserver =
        vtkSmartPointer<ErrorObserver>::New();

      vtkSmartPointer<vtkImageData> image =
        vtkSmartPointer<vtkImageData>::New();
      image->AddObserver(vtkCommand::ErrorEvent,errorObserver);
      image->AddObserver(vtkCommand::WarningEvent,errorObserver);
      image->GetCell(1);
      if (errorObserver->GetError())
      {
        std::cout << "Caught error! " << errorObserver->GetErrorMessage();
      }

      image->ShallowCopy(NULL);
      if (errorObserver->GetWarning())
      {
        std::cout << "Caught warning! " << errorObserver->GetWarningMessage();
      }

      return EXIT_SUCCESS;
    }

### CMakeLists.txt

    cmake_minimum_required(VERSION 3.3 FATAL_ERROR)

    project(ObserveError)

    find_package(VTK COMPONENTS
      vtkCommonCore
      vtkCommonDataModel QUIET)
    if (NOT VTK_FOUND)
      message("Skipping ObserveError: ${VTK_NOT_FOUND_MESSAGE}")
      return ()
    endif()
    message (STATUS "VTK_VERSION: ${VTK_VERSION}")
    if (VTK_VERSION VERSION_LESS "8.90.0")
      # old system
      include(${VTK_USE_FILE})
      add_executable(ObserveError MACOSX_BUNDLE ObserveError.cxx )
      target_link_libraries(ObserveError PRIVATE ${VTK_LIBRARIES})
    else ()
      # include all components
      add_executable(ObserveError MACOSX_BUNDLE ObserveError.cxx )
      target_link_libraries(ObserveError PRIVATE ${VTK_LIBRARIES})
      # vtk_module_autoinit is needed
      vtk_module_autoinit(
        TARGETS ObserveError
        MODULES ${VTK_LIBRARIES}
        )
    endif ()

### Download and Build ObserveError

Click here to download ObserveError and its CMakeLists.txt file. Once the tarball ObserveError.tar has been downloaded and extracted,

    cd ObserveError/build

If VTK is installed:

    cmake ..

If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

    cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

Build the project:

    make

and run it:

    ./ObserveError

WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.