vtkMetaImageWriter does not emit errors to observers
Given a simple observer:
class VTKErrorObserver : public vtkCommand {
public:
VTKErrorObserver() : m_error(false), m_error_message("") {}
static VTKErrorObserver* New() {
return new VTKErrorObserver;
}
bool GetError() const {
return this->m_error;
}
void Clear() {
this->m_error = false;
this->m_error_message = "";
}
virtual void Execute(vtkObject* vtkNotUsed(caller), unsigned long event, void* calldata) {
switch (event) {
case vtkCommand::ErrorEvent:
m_error_message = static_cast<char*>(calldata);
this->m_error = true;
break;
}
}
std::string GetErrorMessage() {
return m_error_message;
}
private:
bool m_error;
std::string m_error_message;
};
When attached to a vtkMetaImageWriter
instance which encounters an error, the error is not emitted to the observer. By contrast, it works for vtkImageWriter
. See the following example:
void file_system::MhdWriter::write(const std::string& file_location, vtkSmartPointer<vtkImageData> image_data) {
if (image_data == nullptr) {
throw InvalidParameter("image_data cannot be null");
}
vtkSmartPointer<VTKErrorObserver> observer = vtkSmartPointer<VTKErrorObserver>::New();
vtkNew<vtkMetaImageWriter> writer;
writer->AddObserver(vtkCommand::ErrorEvent, observer);
writer->SetCompression(true);
writer->SetInputData(image_data);
writer->SetFileName("/root/banana"); // <-- Causes permission denied error
writer->Write();
if (observer->GetError()) {
throw FileSystemException("vtkMetaImageWriter: An error occurred while attempting to write the image data to the file system: " + observer->GetErrorMessage(););
}
vtkSmartPointer<vtk_utils::VTKErrorObserver> image_observer = vtkSmartPointer<vtk_utils::VTKErrorObserver>::New();
vtkNew<vtkImageWriter> image_writer;
image_writer->AddObserver(vtkCommand::ErrorEvent, image_observer);
image_writer->SetInputData(image_data);
image_writer->SetFileName("/root/banana"); // <-- Causes permission denied error
image_writer->Write();
if (image_observer->GetError()) {
throw FileSystemException("vtkImageWriter: An error occurred while attempting to write the image data to the file system: " + image_observer->GetErrorMessage(););
}
}
When run, the vtkMetaImageWriter
example does not throw an exception, whereas the vtkImageWriter
does:
"vtkImageWriter: An error occurred while attempting to write the image data to the file system: ERROR: In [...]/Image/vtkImageWriter.cxx, line 318 vtkImageWriter (0x556e28f16140): RecursiveWrite: Could not open file /root/banana")
When checking for error codes, the after vtkMetaImageWriter section, the most recent error code returns a permission issue error:
vtkNew<vtkMetaImageWriter> writer;
writer->AddObserver(vtkCommand::ErrorEvent, observer);
writer->SetCompression(true);
writer->SetInputData(image_data);
writer->SetFileName("/root/banana"); // <-- Causes permission denied error
auto before = vtkErrorCode::GetLastSystemError();
writer->Write();
auto after = vtkErrorCode::GetLastSystemError();
LOG(WARNING) << "Before: " << before << ", " << "Message: " << vtkErrorCode::GetStringFromErrorCode(before);
LOG(WARNING) << "After: " << after << ", " << "Message: " << vtkErrorCode::GetStringFromErrorCode(after);
When run, it produces:
[WARN] [1673615384.266451088] [frontend]: Before: 2, Message: No such file or directory
[WARN] [1673615384.266485229] [frontend]: After: 13, Message: Permission denied
Suggesting an error occurs when Write()
is called, but it is not emitted.