私はJavaアプリケーションで作業していますが、実行時例外は多くの場所で処理されることがわかります。例えば、
try {
// do something
} catch(NullPointerException e) {
return null;
}
私の質問は、いつランタイム例外を処理するのが良い習慣ですか?例外を未処理のままにする必要があるのはいつですか?
私はJavaアプリケーションで作業していますが、実行時例外は多くの場所で処理されることがわかります。例えば、
try {
// do something
} catch(NullPointerException e) {
return null;
}
私の質問は、いつランタイム例外を処理するのが良い習慣ですか?例外を未処理のままにする必要があるのはいつですか?
回答:
場合によります。
たとえば、指定された文字列を解析できない場合にInteger#parseInt
スローされますNumberFormatException
(RTE)。しかし、ユーザーが整数用のテキストフィールドに「x」を書き込んだからといって、アプリをクラッシュさせたくないのでしょうか。そして、最初に文字列を解析しようとしない限り、文字列を解析できるかどうかをどのようにして知るのでしょうか?したがって、この場合、RTEは単なるエラー信号であり、何らかのエラーメッセージを引き起こすはずです。これはチェック済みの例外であるべきだと主張することもできますが、何ができるのか-そうではありません。
Integer#parseInt
実際にMaybe<Integer>
代わりにa を返し、例外をまったくスローしないでください。
NullPointerExceptionsは通常、欠落したnullチェックの兆候です。したがって、このようにキャッチする代わりに、適切なnullチェックを追加して、例外がスローされないようにする必要があります。
ただし、RunTimeExceptionsを処理することが適切な場合もあります。たとえば、コードを変更して適切な場所にnullチェックを追加できない場合、または例外がNullPointerException以外の場合です。
例外処理のあなたの例はひどいです。そうすると、スタックトレースと問題に関する正確な情報が失われます。また、実際には別の場所で別のNullPointerExceptionをトリガーし、何が起こったのか、それを解決する方法について誤解を招く情報を取得するため、実際には解決していません。
return null;
ます)がより良いソリューションです。
new
std::bad_alloc
C ++をスローします。
例外はそれだけです。例外。例外を使用する際のベストプラクティスは、例外を使用して、発生することが予想されるものとは逆の状況が発生する状況をカバーすることです。典型的な例は、ファイルが存在しない場合にスローされるFileNotFoundExceptionです。ファイルの存在をテストしている場合は、File.exists()を使用します。これは、何かを打ったかどうかを確認するために10フィートのスティックを突き刺しているだけだからです。
try catchで囲み、存在するかのようにファイルを使用することで技術的に同じ結果を得ることができますが、A)例外は一般にリソース的にコストがかかり、B)存在する場合はファイルが存在することをプログラマが想定しますプログラムの全体的な混乱を増すtry catchで。
データベースから値を取得するメソッドを作成する状況は数多くあります。千の事柄がうまくいかない可能性があり、必要な情報が1つだけであるため、5つのさまざまな例外を含むtry catchリストで呼び出しを囲むのは不便です。したがって、fetchメソッドで例外をキャッチします。何か問題が発生した場合は、適切なアクションを実行して、データベース接続を閉じるか、finally節のwhatnotでnullを返します。これは、コードを簡素化するだけでなく、「null」が例外から取得したメッセージと同じメッセージを送信するためです。fetchメソッドで例外の詳細を管理しますが、物事が起こらないときはどうするかを管理します
例えば:
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}