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

intImageMagick がスローするものではないをキャッチしようとしています。実際の例外クラスは、エラー メッセージに示されています: 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 をグーグルで検索すると、実際に std::exception から派生したことを示す Doxygen ドキュメントが得られます: 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 に答える