我有一些(旧的,旧的)控制台应用程序,它们可以处理大型数据库并处理一些数据。 在处理数据时,抛出并捕获异常。不幸的是,如果记录无效,这在某些情况下是有用的。
我想测量异常的数量是否在可接受的范围内。
处理100.000条记录,20 Parallel.ForEach ( ids,(id)=>
{
string typeId, type, value;
typeId= type=value=string.Empty;
bool isValid=false;
if (id.Contains(";"))
{
var IdInfo = id.Split(';');
if (IdInfo[0] != null)
{
typeId = Info[0];
}
if (IdInfo.Length >= 2)
{ type = IdInfo[1]; }
if (IdInfo.Length >= 3)
{ value = IdInfo[2]; }
if (IdInfo.Length >= 4)
{ isValid = IdInfo[3]=="T"; } // T=true
}
else
{
return;
}
DBInsertMethod("someuniqueId", typeId, type, value, isValid);
});
抓住=>正常运行。
处理100.000条记录,10.000 Exceptions
抓住=>那是个问题。
Exceptions
由于现有代码的数量,不能修改每个catch-block。
有人知道如何从.Net获得捕获数量吗?
答案 0 :(得分:5)
您要找的是AppDomain.FirstChanceException:
在运行时在应用程序域中搜索调用堆栈中的异常处理程序之前,在托管代码中抛出异常时发生。
以下是您的方案的示例代码:
AppDomain.CurrentDomain.FirstChanceException += (s, e) => errorCount++;
注意:不在此事件处理程序中使用代码获取广告素材。 绝不能抛出您不处理的异常。如果异常从此事件处理程序中冒出,则将以递归方式调用该事件。因此,我将保留上面显示的代码,不要尝试在此事件处理程序中记录异常或诸如此类的内容。
此外,我相信可以从多个线程调用事件处理程序,因此代码确实需要万无一失。在上面的场景中,如果你在许多线程上有很多异常,你可能最终会失去一些例外,在这种情况下你可能想要将代码重写为:
AppDomain.CurrentDomain.FirstChanceException += (s, e) => Interlocked.Increment(ref errorCount);
但是,如果您需要完全数量的例外,可能只需要这样做。如果您只想获得金额的提示,请留下++
。
答案 1 :(得分:1)
您可以使用面向方面编程(AOP)框架来实现,例如,PostSharp
对于可能发生异常的每种方法,请添加以下属性:
[PrintException] //Add this
public void DoSomething(string someArg)
{
//whatever actions
}
为了自定义异常处理逻辑,您需要从OnExceptionAspect派生PrintException:
[PSerializable]
public class PrintExceptionAttribute : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine(args.Exception.Message); // This is whatever you want to handle the exception
}
}
这样,您不需要进行侵入式修改,而是使用AOP属性编写代码。