是否有可能看到我的应用程序扔了多少“异常”?

时间:2018-03-09 08:28:27

标签: c# .net exception exception-handling

我有一些(旧的,旧的)控制台应用程序,它们可以处理大型数据库并处理一些数据。 在处理数据时,抛出并捕获异常。不幸的是,如果记录无效,这在某些情况下是有用的。

我想测量异常的数量是否在可接受的范围内。

实施例

处理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获得捕获数量吗?

2 个答案:

答案 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属性编写代码。