3

私は実際に、複数のクラスで使用できるライブラリ クラスを作成しています。わかりやすくするために例を単純化しています。A、B、Cの3つのクラスがあるとしましょう:

public class B
{
  public static string B_Method()
  {
    string bstr = String.Empty;

    try
       {


        //Do Something

       }

    catch
        {

        //Do Something

        }

  return bstr;

}

B は私が書いているライブラリ クラスです。ここで、A と C という他の 2 つのクラスがあるとします。

public class A
{
  public void A_Method()
  {
   string astr = B.B_Method();
  }

}

public class C
{
 public void C_Method()
  {
   string cstr = B.B_Method();
  }

}

例外処理について質問です。2 つのクラス A と B のそれぞれのメソッドで、B_Method で発生した例外を独自の方法で処理する必要があります。

フレームワークのデザインパターンを探しましたが、使い物にならないと感じました。

4

4 に答える 4

9

私が通常従うアプローチはこれです:

  • 私のメソッドが例外で何か有用なことができる場合、私はそれをキャッチしてそれを行います。
  • そうでない場合は、キャッチせず、コードの呼び出しに任せて対処します。

「catch all」ブロックを配置する唯一の場所は、UI コードのエントリ ポイント (ボタン クリックのイベント ハンドラーなど) です。例外をキャッチしないとプロセスが停止する可能性があるためです。

これは、例外句が処理可能な特定の例外をキャッチする必要があることも意味します。

私が時々目にする 1 つのアプローチは、例外をキャッチし、それを新しい例外タイプにラップしてスローすることです。これによりある程度のトレーサビリティが提供されますが、さまざまなシナリオで特定の catch 句を使用するなど、呼び出しコードの例外処理でいくつかのオプションが削除されているようにも感じます。これらの場合、代わりに if 節を使用して内部例外を検査する必要がありますが、私の目には読みにくいです。

于 2012-12-14T11:22:28.463 に答える
1

B は私が書いているライブラリ クラスです。

Bコードを制御できる場合は、例外をキャッチするB必要があります。throw

public class B
{
    public static string B_Method()
    {
        string bstr = String.Empty;

        try
        {
            // Do Something
        }
        catch(Exception e)
        {
            // Do Something (Log the exception details)
            throw;
        }

        return bstr;
    }
}

2 つのクラス A と B のそれぞれのメソッドで、B_Method で発生した例外を独自の方法で処理する必要があります。

これでB、例外をログに記録し、再スローされた例外を独自の方法で処理できるようになりましたAC

于 2012-12-14T11:25:57.847 に答える
0

クラス b から try および catch ブロックを削除します

public static string B_Method()throws Exception{
    boolean success=compute();
    if(!success){
       throw new Exception("an error occured");
     }
} 
private static boolean compute(){
    return false;
}
于 2012-12-14T11:26:34.360 に答える
0

B_Method で例外を再スローするか、そのままスローして、A および C クラスでキャッチすることができます。

public class A
{
  public void A_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in A way
  }

}

public class C
{
 public void C_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in C way
  }
}

ここではデザインパターンは実際には当てはまらないと思います..ただのオブジェクト指向プログラミングです。

于 2012-12-14T11:23:15.387 に答える