例外のメッセージを正確に表示する

例外を捕捉したApplicationオブジェクトは、例外のメッセージをダイアログで表示します。この時、メッセージがピリオド、感嘆符、疑問符など、シングルバイト文字の記号で終わっていない場合、ピリオドが自動的に追加されます。
例: "Index out of range" => "Index out of range."
この動作の問題点は、メッセージがマルチバイト文字の句読点で終わる時にも、ピリオドが追加されてしまうことです。
例: "インデックスが範囲を越えています。" => "インデックスが範囲を越えています。."
それを回避するには、ApplicationオブジェクトのOnExceptionにハンドラを設定し、このハンドラでメッセージの表示を代行します。例えば、次のようにします。
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationException(TObject* ASender, Exception* AException)
{
        try {
                Application->MessageBox(
                        AException->Message.c_str(),
                        Application->Title.c_str(),
                        MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
        }
        catch(...) {
                // Prevent the endless loop of exceptions
        }
}
//---------------------------------------------------------------------------
最終更新: 2008-08-17

戻る