まず、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ははるかに頻繁に実行する必要があります。)