Visual C++: クラスのprivateな継承で「ハンドルされていない例外」
WindowsアプリをVisual C++で開発していて、以下のエラーになることがあった。
XXXXXXXX.exe の 0xXXXXXXXX でハンドルされていない例外が発生しました: Microsoft C++ の例外: CFooError (メモリの場所 0xXXXXXXXX)。
上記はVisual Studioでデバッグしているときのメッセージで、普通に起動していると以下のメッセージが出る。
Runtime Error! Program: XXXXXXXX this application has requested the Runtime to terminate it in an unusual way. please contact the application's support team for more information.
しかし、自分としてはちゃんと例外はキャッチしているのにな?と最初は分からなかった。以下のように親クラスでキャッチしているつもりだった。
try { // .... } catch (CBarError e) { // ここに到達する前にRuntime Errorのメッセージが出る。 }
悪かったのは例外クラスの継承のさせ方。
class CFooError : CBarError { };
publicな継承にしていなかったので指定なしのclassの継承はprivateになっていた。普通にpublicを指定すれば、OK。
class CFooError : public CBarError { };
最近、Javaが多かったもので…と言い訳。