11

このようなtry catchで周囲のコードにうんざりしています..

try
{
    //some boring stuff
}
catch(Exception ex)
{
    //something even more boring stuff
}

次のようなものが欲しい

SurroundWithTryCatch(MyMethod)

関数の正確な署名でデリゲートを作成することでこの動作を実現できることはわかっていますが、アプリケーションのすべてのメソッドのデリゲートを作成することはオプションではありません。

ILコードを挿入することでこれを行うこともできますが、これは私の周りにラッパーアセンブリを作成するため、パフォーマンスの面で高価です.

他に有効なアイデアはありますか?

4

7 に答える 7

24

まず、try / catchを頻繁に使用しているようです。特に、キャッチしている場合はそうですException。try/catchブロックは比較的まれなはずです。例外を実際に「処理」できない限り、スタックの次のレイヤーまでバブルアップさせる必要があります。

さて、これらすべてのtry / catchブロックが本当に必要だとすると、デリゲートを作成するオプションがないのはなぜですか?匿名メソッドとラムダ式、およびSystem名前空間のFunc / Actionデリゲートを使用すると、基本的に行う作業はほとんどありません。あなたが書く:

public void SurroundWithTryCatch(Action action)
{
    try
    {
        action();
    }
    catch(Exception ex)
    {
        //something even more boring stuff
    }    
}

そして、それがパラメータを必要としない場合、あなたSurroundWithTryCatch(MyMethod)はうまくいくでしょう。

または、別のメソッドを呼び出したくない場合は、次のように記述します。

public void MyMethod()
{
    SurroundWithTryCatch(() => 
    {
        // Logic here
    });
}

メソッドから戻る必要がある場合は、次の操作を実行できます。

public int MyMethod()
{
    return SurroundWithTryCatch(() => 
    {
        // Logic here
        return 5;
    });
}

このような一般的なオーバーロードでSurroundWithTryCatch

public T SurroundWithTryCatch<T>(Func<T> func)
{    
    try
    {
        return func();
    }
    catch(Exception ex)
    {
        //something even more boring stuff
    }    
}

これのほとんどはC#2でも問題ありませんが、型推論はそれほど役に立ちません。ラムダ式の代わりに匿名メソッドを使用する必要があります。

ただし、最初に戻るには、try/catchの使用頻度を減らしてみてください。(通常はusingステートメントとして記述されますが、try / finalははるかに頻繁に実行する必要があります。)

于 2008-11-11T06:35:57.973 に答える
4

アスペクト指向プログラミングも役に立ちますが、これにはライブラリをプロジェクトに追加する必要がある場合があります。この場合、 postsharpが役に立ちます。このリンクを参照してくださいhttp://doc.postsharp.org/1.0/index.html#http://doc.postsharp.org/1.0/UserGuide/Laos/AspectKinds/OnExceptionAspect.html#idHelpTOCNode650988000

于 2008-11-11T08:03:23.973 に答える
3

代わりに、null 検証を使用してみることができます。LINQ to SQL の例を次に示します。

var user = db.Users.SingleOrDefault(u => u.Username == 3);

if (user == null)
    throw new ArgumentNullException("User", "User cannot be null.");

// "else" continue your code...
于 2008-11-11T06:09:30.897 に答える
2

おそらく、例外処理を別の構文でエラー コードとして扱っているのでしょうか? だから、試したり捕まえたりしないでください。例外を上方に伝搬させます。

于 2008-11-11T06:10:33.373 に答える
2

私にとっては、アスペクト指向プログラミングを求めているようです。PostSharp を見てみるとよいと思います。

于 2008-11-11T07:41:09.823 に答える
0

C#についてはよくわかりませんが、Javaランドでは、すべてのメソッドを定義してインターフェイスし、プロキシオブジェクトの下に非表示にすることができます。次のように定義することで、さらに多くのコードを記述して逃げることができます。

ExceptionCatcher.catchAll(new Runnable() {
  public void run() {
     //run delegate here
     MyMethod();
  }
});

そしてcatchAll()は、ランナブルを呼び出し、その周りにtry-catchブロックをラップします。

しかし、あなたが本当に望んでいるのは、優れたクロージャサポートを備えた言語だと思います。クロージャを使用すると、やりたいことが非常に簡単になります。

于 2008-11-11T06:34:44.963 に答える
0

Java を使用している場合、RuntimeExceptions があります。これは、回復が期待できない問題が発生したことを意味する例外です。調べる。ここから始めてください: http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html

たとえば、Spring のデータ アクセス ビットは、問題が発生したときにさまざまな RuntimeExceptions をスローします。それらの処理はオプションです。

于 2008-11-11T09:40:46.383 に答える