これはそれほど問題ではありませんが、より多くのフィードバックと考えがあります。私は、社内チームを通じて徹底的にテストされたメソッドの実装を検討してきました。一般的な例外キャッチメソッドとレポートサービスを作成したいと思います。
これは「try-catch」ブロックほど簡単ではありませんが、例外をキャッチするための統一された方法を可能にします。理想的には、メソッドを実行し、失敗のコールバックを提供し、呼び出し元のメソッドからすべてのパラメーターをログに記録したいと思います。
一般的な試行-実行。
public class ExceptionHelper
{
public static T TryExecute<T, TArgs>(Func<TArgs, T> Method, Func<TArgs, T> FailureCallBack, TArgs Args)
{
try
{
return Method(Args);
}
catch (Exception ex)
{
StackTrace stackTrace = new StackTrace();
string method = "Unknown Method";
if (stackTrace != null && stackTrace.FrameCount > 0)
{
var methodInfo = stackTrace.GetFrame(1).GetMethod();
if (methodInfo != null)
method = string.Join(".", methodInfo.ReflectedType.Namespace, methodInfo.ReflectedType.Name, methodInfo.Name);
}
List<string> aStr = new List<string>();
foreach (var prop in typeof(TArgs).GetProperties().Where(x => x.CanRead && x.CanWrite))
{
object propVal = null;
try
{
propVal = prop.GetValue(Args, null);
}
catch
{
propVal = string.Empty;
}
aStr.Add(string.Format("{0}:{1}", prop.Name, propVal.ToString()));
}
string failureString = string.Format("The method '{0}' failed. {1}", method, string.Join(", ", aStr));
//TODO: Log To Internal error system
try
{
return FailureCallBack(Args);
}
catch
{
return default(T);
}
}
}
}
私が欠点として知っていること。
- リフレクションを使用したパフォーマンスの低下
- MethodBase(methodInfo)は、最適化では利用できない場合があります
- エラーハンドラのtry-catch。基本的に、エラーコールバックを回避するためのtry-catchにTryExecuteラッパーを使用できますが、スタックオーバーフローの状況が発生する可能性があります。
これがサンプル実装です
var model = new { ModelA = "A", ModelB = "B" };
return ExceptionHelper.TryExecute((Model) =>
{
throw new Exception("Testing exception handler");
},
(Model) =>
{
return false;
},
model);
考えやコメントをいただければ幸いです。