Magick::Exception 类

Exception 代表当 Magick++ 报告错误时抛出的对象的基类。Magick++ 在发生错误的操作与同步时抛出 C++ 异常。这允许在封闭代码(可能是处理单个图像的代码)内捕获错误,同时允许以简单的编码风格编写代码。

应该在任何可以被认为是重要工作体的操作序列周围放置一个 try/catch 块。例如,如果您的程序处理图像列表,而其中一些图像可能存在缺陷,则可以通过在处理一个图像的整个代码序列(包括实例化图像对象)周围放置 try/catch 块来最小化错误检查的开销,同时确保创建的所有对象在处理完该对象后都被安全地销毁(C++ 异常会展开堆栈直到封闭的 try 块,销毁任何创建的对象)。

程序主循环的伪代码可能如下所示

using namespace std; for infile in list { try { // 首先构造一个图像实例,这样我们就不必担心 // 由于抛出次要警告异常而导致对象构造失败。 Magick::Image image; try { // 尝试读取图像文件 image.read(infile); } catch( Magick::WarningCoder &warning ) { // 处理加载文件时的编码器警告(例如 TIFF 警告) // 也许用户会对这些警告感兴趣(或者不感兴趣)。 // 如果在加载图像时产生了警告,则图像 // 通常仍然可以使用(但如果警告是关于 // 某些重要的事情!) cerr << "编码器警告: " << warning.what() << endl; } catch( Magick::Warning &warning ) { // 处理任何其他 Magick++ 警告。 cerr << "警告: " << warning.what() << endl; } catch( Magick::ErrorFileOpen &error ) { // 处理 Magick++ 文件打开错误 cerr << "错误: " << error.what() << endl; continue; // 尝试下一个图像。 } try { image.rotate(90); image.write("outfile"); } catch ( MagickExeption & error) { // 处理旋转或写入 outfile 时的故障。 cerr << "捕获 Magick++ 异常: " << error.what() << endl; } } catch( std::exception & error ) { // 处理任何其他从标准 C++ 异常派生的异常 cerr << "捕获 C++ STD 异常: " << error.what() << endl; } catch( ... ) { // 处理 *任何* 异常(最后的努力)。这里没有太多 // 你能做的事情,除了重试失败的操作或退出 } }

程序中 try/catch 块的期望位置和数量取决于其错误处理必须多么复杂。非常简单的程序可能只使用一个 try/catch 块。

Exception 类派生自 C++ 标准异常类。这意味着它包含一个 C++ 字符串,其中包含有关错误的附加信息(例如显示给用户)。通过 what() 方法获取对该字符串的访问权。例如

catch( Exception & error_ ) 
    { 
      cout << "Caught exception: " << error_.what() << endl; 
    }

WarningError 类派生自 Exception 类。从 Warning 派生的异常用于表示可能影响结果的完整性或质量的非致命错误(例如,提供给 montage 的一个图像存在缺陷)。在大多数情况下,可以通过立即捕获 Warning 异常、处理它(例如打印诊断信息)并继续执行来忽略它。从 Error 派生的异常用于表示无法产生有效结果的致命错误(例如,尝试读取不存在的文件)。

以下表格显示了具体的派生异常类

警告子类


错误子类