0

我正在尝试使用 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 会捕捉到这一点,但我对 python 的 try/except 有更多的经验。我希望其他事情也可能导致故障,例如 404 或 500。

我能做些什么?

4

2 回答 2

4

您正在尝试捕获int,这不是 ImageMagick 抛出的。您的错误消息中指出了实际的异常类:Magick::ErrorCoder.

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

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

或查阅 ImageMagick 文档并获取该类的基类。

于 2013-10-18T23:32:57.970 回答
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();
}
于 2013-10-18T23:51:31.220 回答