2

フレームワーク用のJavaプラグインに取り組んでいます。

entryPoint 関数が以下のようになるようにコードを記述しました (これが開始点、メイン関数であると考えてください)。

function entryPoint()
{
   try{
      //some code block
      subFunction1();
      subFunction2();
   }
   catch(Exception e) {}
   catch(IOException ioe) {}
   catch(NullPointerException npe){}
}

function subFunction1() throws IOException
{
    //some code
}

function subFunction2() throws NullPointerException
{
    //some code
}

つまり、すべてのサブ関数が特定の例外をメジャー関数にスローし、これらの例外をメジャー関数でキャッチして処理するという考え方です。

この方法は正しいですか?そうでない場合は、より良い方法を提案してください。

4

5 に答える 5

10
  • catchステートメントの順序を変更する必要があります。1つ目catchは all に一致するExceptionsため、次の 2 つがトリガーされることはありません。

  • ほとんどの場合、これNPEは予期しないものであり、回復できません。それをキャッチすることは、アプリケーションがそれから回復し、関係なく実行できることを意味します。本当にそうですか?

  • 回復可能であっても、コマンド フローの例外に頼るのではなく、NPE確認することをお勧めします。!= nullこれは、パフォーマンス上の理由だけでなく、概念的な理由 (例外ベースのコマンド フローにはより多くのコードが必要であり、読みにくく、意図が不明確であることが多い) によるものです。

  • すべてExceptionsが飲み込まれます - ロギングや再スローは行われません。この方法では、例外がログに記録されないため、何か問題が発生したかどうか、いつ問題が発生したかを知ることはできません。ほとんどの場合、ユーザー、他の開発者、メンテナーは、ほとんどすべての例外が真に例外的であり、ログに記録されることを期待しています。

于 2013-05-06T08:11:19.863 に答える
1

NullPointerException をキャッチまたはスローしないでください。また、例外の catch ブロックは最後のブロックにする必要があります。

于 2013-05-06T08:11:56.033 に答える
0

このアプローチは完璧だと思います。すべてをまとめて処理するのではなく、特定の例外を処理するようにしてください。ただのtry-catchブロックを置くことは、それを使用するのではなく、try-catchの悪用です。

ええ、例外は最後に処理する必要があります。これを見逃しました。

要するに、意図は適切であり、構文的にはコンパイラに依存できます。

于 2013-05-06T08:11:11.730 に答える
0

プラグインがない場合と同じ方法で例外処理を行う必要があります。1 つの主要なメソッドですべての例外を処理できるかどうかは、アプリケーションによって異なります。仕事を続けられる場合があれば、このままでは難しいかもしれません。

プラグインに関して私が行う唯一のことは、すべての周囲の「キャッチオール」と、より詳細なログを作成するための特別なケースです。フレームワークがそれ自体を行わない場合は、これも行う必要があります。

于 2013-05-06T08:13:27.400 に答える
0

結果として生じる問題を実際に解決できる最初の可能な場所で例外をキャッチするのが最善だと思います。

例:

function int divide(int a, int b) throws DivisionByZeroException {
    if(b == 0){
        throw new DivisionByZeroException();
    }
    return a / b;
}

function int doCalculationsAndStuff(int a, int b) throws DivisionByZeroException {
    int result = divide(a, b);
    ...
    return result; 
}

function void main() {
    try {
        int a = userInput();
        int b = userInput();
        int result = doCalculationsAndStuff(a, b);
        print("result: " + result);
    } catch(DivisionByZeroException e) {
        print("Division by zero happened. But i catched it for you =).");
    }
}

divide()またはで例外を処理しても意味がありませんdoCalculationsAndStuff()。ゼロ除算の場合、どのような値が返されるのでしょうか? mainそのため、電卓アプリのユーザーにフィードバックを提供する関数で例外をスローして処理します。

あなたの質問に戻りましょう。entryPoint関数がサブ関数で発生する問題を解決できる最初の場所である場合は、それを処理するのに適した場所です。

于 2013-05-06T10:58:02.723 に答える