私はCライブラリlibusbを使用しています。 libusbメソッドはエラーを示すためにlibusb_error
enum valuesを返します。私はこれらのメソッドが代わりに例外をスローするようにしたい。列挙型の戻り値をC++の例外に変換するには?
各libusbエラーには、libusb_strerror()
機能で取得できる説明があります。私はこれを例外のスローされた例外のメソッドが返すようにしたい。
私の最初の試みは、エラーの説明で構成std::runtime_error
をスローするラッパー関数関係:
libusb_error wrapper(libusb_error error) {
if(error >= 0) return error;
throw std::runtime_error(libusb_strerror(error));
}
をしかし、そのアプローチを使用すると、私はエラーだけでも、特定のlibusbエラーのlibusbキャッチすることはできませんを意味します。
私は、その後のlibusbエラーのstd::exception
のテンプレートサブクラスを作った:
template<libusb_error error>
class LIBUSBError : public std::exception {
using std::exception::exception;
virtual const char* what() const throw() {
return libusb_strerror(error);
}
};
アプローチは、特定のlibusbエラーをキャッチするために私にできること。しかし、テンプレートパラメータには、私のラッパー関数内の各列挙値のために複数のステートメントを使用するために私を必要とし、定数式でなければならない:
私が書くために私を必要とせずにC++の例外へのlibusbメソッドの戻り値を変換するにはどうすればよい// * * *
libusb_error wrapper(libusb_error error) {
if(error >= 0) return error;
if(error == LIBUSB_ERROR_IO) {
throw LIBUSBError<LIBUSB_ERROR_IO>();
}
if(error == LIBUSB_ERROR_ACCESS) {
throw LIBUSBError<LIBUSB_ERROR_ACCESS>();
}
// ... etc
}
// * * *
try {
wrapper(libusb_open(device, &handle));
} catch(LIBUSBError<LIBUSB_ERROR_ACCESS> e) {
std::cerr << e;
continue;
}
// * * *
各列挙型の値を外しますか?
enum値に応じて適切な例外を格納するマップを作成することができます –
エラーの種類ごとに個別のキャッチブロックが必要ですか?もしそうでなければ、1つの引数(enum値)を受け入れ、それに応じて 'std :: exception'を構築する' LIBUSBError'にctorを書くのは賢明でしょう。 – myaut
エラーごとに別々のクラスが必要な場合は、それらを生成するファクトリを生成する方法について、この回答を確認してください。https://stackoverflow.com/questions/29400314/enums-and-initialising-classes/29401310#29401310 – myaut