如何拦截 ImageMagick 在 C++ 中抛出的异常
How do I intercept an exception thrown by ImageMagick in C++?
我正在尝试使用ImageMagick从互联网上检索照片。偶尔会有一个问题。我该如何处理?
char file[] = "http://distilleryimage10.s3.amazonaws.com/1f6be58e383e11e3acaf22000ae80c8d_8.jpg";
Magick::Image image;
// use Magick to load the file
try {
image.read(file);
}
catch(int err) {
printf("Error retrieving snapshot. Skipping.n");
return;
}
/* ... use this image */
例如,该特定 URL 的访问权限受到限制。ImageMagick只是抛出了一个异常,并说:
terminate called after throwing an instance of 'Magick::ErrorCoder'
what(): Magick: no data returned `http://distilleryimage10.s3.amazonaws.com/1f6be58e383e11e3acaf22000ae80c8d_8.jpg' @ error/url.c/ReadURLImage/232
Aborted
我以为我的尝试/捕获会捕获它,但我对 python 的尝试/除外有更多的经验。我希望其他事情也可能导致故障,例如 404 或 500。
我能做什么?
你试图抓住一个int
,这不是ImageMagick抛出的。错误消息中指示了实际的异常类:Magick::ErrorCoder
。
您可以捕获此异常类型:
try {
image.read(file);
}
catch(Magick::ErrorCoder& err) {
//...
};
或者查阅 ImageMagick 文档并获取此文档的基类。
一般来说,
你至少应该通过std::exception来捕获。任何明智的库都会从 std::exception 派生其异常类 - 这就是它的用途。
std::exception 的 what() 方法会给你一些关于异常的提示。谷歌搜索Magick::ErrorCoder会产生Doxygen文档,这确实表明它来自std::exception:http://www.imagemagick.org/api/Magick++/classMagick_1_1ErrorCoder.html
正如 syam 所建议的那样,既然你知道 Magick::ErrorCoder 异常是在出现问题时发出的,那么你应该捕获这些异常,可能还有它派生的中间异常类,但始终捕获 std::exception,因为这将允许你的程序报告你的库抛出的任何合理的 c++ 异常。
try
{
image.read(file);
}
catch(Magick::ErrorCoder const & err)
{
// Some specific error handling for this problem
}
catch(Magick::Error const & err)
{
// Some general handling for ImageMagick errors
}
catch(Magick::Exception const & err)
{
// Some general handling for ImageMagick errors/warnings (apparently)
}
catch(std::exception const & err)
{
// Something bad happened - possibly caused by imagemagick using its libraries
// incorrectly. Just report it - at least we didn't bomb out:
std::cout << err.what();
}
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常