まず第一に、標準的な答えは、フロー制御に例外を使用することは決してないということです。私はこれに完全に同意しますが、私が時々行ったことについて長い間考えてきました。これを次の擬似コードで説明します。
try
string keyboardInput = read()
int number = int.parse(keyboardInput)
//the conversion succeeds
if(number >= 1000)
//That's not what I asked for. The message to display to the user
//is already in the catch-block below.
throw new NumberFormatException() //well, there IS something wrong with the number...
catch(NumberFormatException ex) //the user entered text
print("Please enter a valid number below 1000.")
まず、この例を非常に抽象的な方法で取り上げます。これは、必ずしも発生する必要はありません。状況は単に次のとおりです。
ユーザー入力は制限する必要があり、言語が定義するスローされた例外またはチェックのいずれかによって、2 つの方法で問題が発生する可能性があります。どちらのエラーも同じ方法で報告されます。これは、エラーの原因の技術的な違いを知る必要がないためです。
私はそれを解決するいくつかの方法を考えました。まず、カスタムメイドの例外をスローする方がよいでしょう。次に直面する問題は、ローカルでキャッチした場合、他の例外をどうするかということです。この場合、カスタム例外は 2 番目の catch-block の原因となり、メッセージも同様にコピーされます。私の解決策:
//number is wrong
throw new MyException()
catch(NumberFormatException ex)
throw new MyException()
catch(MyException ex) {
print("Please enter...")
例外の名前の意味はすべてここにあります。このカスタム例外の適用は広く受け入れられていますが、基本的には最初の方法と何も変わっていません。つまり、標準ライブラリの例外ではなくカスタム例外をスローすることによって、強制的に catch ブロックに入る必要がありました。
呼び出し元のメソッドに例外をスローするのと同じ方法 (つまり、カスタム例外の catch ブロックを持たない) の方が理にかなっているようです。私の方法は、技術的には2 つの方法で失敗する可能性がありますが、本質的には 1 つの方法である、間違ったユーザー入力です。したがって、 a を記述しUserInputException
て、メソッドに this をスローさせます。新しい問題: これがアプリケーションのメインメソッドである場合はどうなるでしょうか?
私は現在、この種の動作を実装する特定のアプリケーションに苦労していません。私の質問は純粋に理論的であり、言語に固有のものではありません。
これにアプローチする最良の方法は何ですか?