現在、 libjpegを使用して JPEG 画像を保存しています。エラーが発生した場合、libjpeg のデフォルトの動作は を呼び出すexit()
ことですが、これは私のプログラムにとって致命的なエラーではないため、回避したいと考えています。libjpegでは、独自のエラー マネージャーを使用できますerror_exit()
。また、独自の関数 (exit()
既定で呼び出す)を使用する場合は、制御を呼び出し元に返してはならないことが義務付けられています。libjpeg は、プログラムではなくsetjmp.hを使用してこの要件を満たすことを提案してexit()
います。
ただし、私は C++ プログラムを作成しており、例外にアクセスできます。この質問の答えは、(明確に定義された動作のように) コールバックから例外をスローしても安全であると述べています。ただし、動的ライブラリについては言及されておらず、動的ライブラリの境界を越えて例外をスローしないという一般的な経験則があります。
次に例を示します。
#include <iostream>
#include <jpeglib.h>
#include <cstdio>
#include <stdexcept>
static void handleLibJpegFatalError(j_common_ptr cinfo)
{
(*cinfo->err->output_message)(cinfo);
throw std::runtime_error("error in libjpeg, check stderr");
}
int main()
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* file = std::fopen("out.jpeg", "wb"); // assume this doesn't fail for this example
try
{
cinfo.err = jpeg_std_error(&jerr);
jerr.error_exit = handleLibJpegFatalError;
// let's say this triggers a fatal error in libjpeg and handleLibJpegFatalError() is called
// by libjpeg
jpeg_create_compress(&cinfo);
}
catch (...)
{
std::cerr << "Error saving the JPEG!\n";
}
jpeg_destroy_compress(&cinfo);
std::fclose(file);
}
私が知りたいのは、libjpeg が動的ライブラリとしてコンパイルされている場合でも、このコールバックから例外をスローし、それをアプリケーションでキャッチすることはできますか? libjpeg は静的ライブラリまたは動的ライブラリである可能性があり、動的ライブラリの場合は別のコンパイラでビルドされている可能性があります。ただし、例外をスローしてキャッチするコードは、確実に同じコンパイル単位にあります。上記のコードは安全ですか?
参考までに、私は OS X と Windows 向けに開発しています (そして、将来の Linux の可能性を念頭に置いています) ので、これが特定のプラットフォームではなく、一般的に明確に定義された動作であることが知られているかどうかにもっと興味があります/コンパイラ。