ユーザーが構成ファイルを介して日付の書式設定をカスタマイズできるようにする C++/MFC アプリケーションがあります。車輪を再発明したくないので、フォーマット文字列を CTime::Format("< format string >") に渡して、実際のフォーマットを行います。内部では、Format は標準 C 関数 strftime() のバリアントを呼び出します。
当然、ユーザーは誤って無効な書式文字列を入力する可能性があります。(たとえば、"%S" ではなく "%s" です。) これが発生すると、C ランタイムは無効な引数ハンドラーを呼び出し、既定ではアプリを終了します。(キャッチする例外はありません。アプリを終了するだけです。)
私の質問は、この信頼できない入力を適切に処理する方法です。理論的には、フォーマット文字列用の独自のパーサー/バリデーターを作成できますが、これは時間の無駄のように思えます。代わりに、私が思いついた最善の方法は、終了する代わりに無効な引数例外をスローする独自の (グローバル) 無効な引数ハンドラーを設定することでした。
void MyInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
::AfxThrowInvalidArgException();
}
これは機能しているようで、無効な引数の例外が発生することが「予想される」場合に、無効な引数の例外を明示的にキャッチ (および適切に処理) することができます。ただし、比較的「ローカルな」問題を解決するために、大規模なアプリケーションでグローバルなランタイム設定をオーバーライドしているのではないかと心配しています。
このアプローチは賢明ですか?または、この問題を解決するよりクリーンなアプローチはありますか?