如何拦截ImageMagick在C ++中抛出的异常?

时间:2013-10-18 23:27:32

标签: c++ imagemagick

我正在尝试使用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

我认为我的try / catch会捕获它,但我有更多使用try / except来自python的经验。我希望其他事情也可能导致错误,比如404或500。

我该怎么办?

2 个答案:

答案 0 :(得分:4)

你正试图捕捉int,这不是ImageMagick所引发的。您的错误消息中指出了实际的异常类:Magick::ErrorCoder

您可以捕获这种异常类型:

try {
  image.read(file);
}
catch(Magick::ErrorCoder& err) {
  //...
};

或查阅ImageMagick文档并捕获此类的基类。

答案 1 :(得分:2)

一般来说,你应该至少抓住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();
}