1

これは一般的なプログラミングの質問であり、特定の言語には関係ありません。

新しいプログラマーは通常、何らかの値を計算してから値を返すメソッドを作成します。

public Integer doSomething()
{
   // Calculate something
   return something;
}

public void main()
{
  Integer myValue = doSomething();
}

しかし、 の計算中に例外が発生した場合something、特にユーザーにフィードバックを提供する場合、例外を処理する最善の方法は何でしょうか? の計算の try/catch を実行しsomething、例外がキャッチされた場合、何を返しますか? 何も計算されていないので、null を返しますか? そして、それを返したら (それが何であれ)、有効な値が返されたかどうかを確認するために、親メソッドで別の try/catch を実行する必要がありますか? そうでない場合は、ユーザーに何らかのフィードバックが提供されていることを確認してください。

テーブルの両側で、値をまったく返さないという議論を聞いたことがありますが、代わりに、計算された値をポインターまたはグローバル変数として設定し、代わりにメソッドからエラーコードのみを返し、(親メソッドで) エラーコードをそれに応じて処理するだけです。 .

これに対するベストプラクティスまたはアプローチはありますか? これを処理する最善の方法について詳しく知るためにアクセスできる優れたリソースはありますか?

明確化のための更新

次のコードを検討してください。

public void main()
{
  int myValue = getMyValue();

  MyUIObject whatever = new MyUIObject();
  whatever.displayValue(myValue); // Display the value in the UI or something
}

public Integer getMyValue()
{
  try
  {
    // Calculate some value
  } catch (exception e) {
    // ??
  }
  return value;
}

メソッドを呼び出して int 値を取得し、それを返します。に戻ってmain()、この場合はログに表示するなど、値を使用して何かを行います。通常、ユーザーの UI に値を表示します。

とにかく、 で例外がキャッチされた場合はgetMyValue()返されvalueますが、null ですか? その時どうなるmain()?それが有効な値であるかどうかもテストする必要がmain()ありますか?

それに応じてエラーを処理し、続行するプログラムが必要です。getMyValue()以下の誰かが、メソッド内から UI に適切な情報を表示することを提案しました。潜在的な問題が 2 つあります。

  1. ビジネス ロジックと (この場合は) UI のロジックを混在させているようです。
  2. MyUIObject関数内からアクセスできるように、getMyValue()または何かへの参照を渡す必要があります。上記の単純な例では大したことではありませんが、 で発生したことに基づいて更新または変更する必要がある多数の UI 要素がある場合、getMyValue()それらすべてを渡すのは少し面倒かもしれません...

このすべての基本についてたくさん読んだことがありますが、上記の状況に対する直接的な答えを見つけることができないようです。助けや洞察に感謝します。

4

3 に答える 3

2

あなたは例外をよく理解していないと思います。

例外をスローすると、関数から正常に戻りません。

public Integer doSomething()
{
   throw new my_exception();
   // The following code does NOT get run
   return something;
}

public void main()
{
  Integer myValue = doSomething();
}

例外の主な利点は次のとおりです。

  • すべてが成功しているかのようにコードを書くことができます。これは通常、より明確です。
  • 例外を無視するのは困難です。例外が処理されない場合は、通常、スタック トレースと共に明白で大きなエラーが発生します。これは、エラー処理を無視するよりも無視する方がはるかに簡単なエラー コードとは対照的です。

Eric Lippert によるこの投稿をお勧めします。この記事では、例外と、それらを処理するのが適切な場合とそうでない場合について説明しています。


更新(コメントへの応答):

例外を確実に処理して続行できます。これは、例外をキャッチすることによって行います。

例えば:

try
{
   // Perform calculation
}
catch (ExceptionType ex)
{
   // A problem of type 'ExceptionType' occurred - you can do whatever you
   // want here.
   // You could log it to a list, which will be later shown to the user,
   // you could set a flag to pop up a dialog box later, etc
}

// The code here will still get run even if ExceptionType was thrown inside
// the try {} block, because we caught and handled that exception.

これの良いところは、(例外の種類から) どのような問題が発生したか、および の情報を調べることで詳細がわかるexため、正しいことを行うために必要な情報が得られることです。


あなたの編集に応じてUPDATE 2 :

必要な方法で応答できるレイヤーで例外を処理する必要があります。あなたの例では、あなたは正しいです。UIなどにアクセスできないため、コードの奥深くで例外をキャッチするべきではなく、実際には何も役に立ちません。

サンプルコードのこのバージョンはどうですか:

public void main()
{
  int myValue = -1; // some default value
  String error = null; // or however you do it in Java (:
  
  try
  {
    getMyValue();
  }
  catch (exception e)
  {
    error = "Error calculating value. Check your input or something.";
  }

  if (error != null)
  {
    // Display the error message to the user, or maybe add it to a list of many
    // errors to be displayed later, etc.
    // Note: if we are just adding to a list, we could do that in the catch().
  }

  // Run this code regardless of error - will display default value
  // if there was error.
  // Alternatively, we could wrap this in an 'else' if we don't want to
  // display anything in the case of an error.
  MyUIObject whatever = new MyUIObject();
  whatever.displayValue(myValue); // Display the value in the UI or something
}

public Integer getMyValue()
{
  // Calculate some value, don't worry about exceptions since we can't
  // do anything useful at this level.
  return value;
}
于 2011-10-10T22:42:57.340 に答える
0

あなたが書いた:

テーブルの両側で、値をまったく返さないという議論を聞いたことがありますが、代わりに、計算された値をポインターまたはグローバル変数として設定し、代わりにメソッドからエラーコードのみを返し、(親メソッドで) エラーコードをそれに応じて処理するだけです。 .

[編集] 実際には、例外はエラー コードとして表示され、関連するメッセージと共に表示されます。プログラマは、例外をどこでキャッチして処理し、最終的にユーザーに表示する必要があるかを知っておく必要があります。例外を伝播させる (呼び出された関数のスタックに移動する) 限り、戻り値は使用されないため、関連する欠落した値の処理について気にする必要はありません。適切な例外処理は非常に難しい問題です。

jwdが答えたように、メソッドで例外を発生させ、エラー値を返すためだけに同じメソッドで例外を処理するポイントがわかりません。明確にするために:

 public Integer doSomething(){

     try{

         throw new my_exception();}

     catch{ return err_value;} 

     }

無意味です。

于 2011-10-10T22:44:53.380 に答える
0

例外は、オブジェクト指向言語 (OOL) のプロパティです。OOL を使用する場合は、例外を優先する必要があります。エラー コードを返すよりもはるかに優れています。エラー コード アプローチが、例外ベースのコードよりもはるかに長いソース コードを生成する良い例を見つけることができます。たとえば、ファイルを読み取って何かを実行し、別の形式で保存する場合などです。例外なく C で実行できますが、コードは if(error)... ステートメントでいっぱいになります。おそらく、いくつかの goto ステートメントやいくつかのマクロを使用してコードを短くしようとするでしょう。しかし、完全に不透明で理解しにくいものでもあります。また、エラーが表示されずにプログラムが続行されるように、戻り値をテストするのを忘れることがよくあります。それは良いことではありません。一方、OOL で記述して例外を使用すると、ソース コードは「

個人的には、オブジェクト指向言語でエラー コードを返すことは決してありません。1 つの例外は C++ で、例外のシステムにはいくつかの制限があります。

于 2011-10-10T22:54:29.487 に答える