Kow*_*Tom 12 .net c# vb.net error-handling .net-4.0
问题:
我想从类中的任何方法中捕获任何异常,以便我可以将特定于类的数据记录到异常中,以便在它向上传递到堆栈之前进行记录.我知道我可以在类的每个方法中放置一个try-catch,但是有很多方法,似乎应该有一个更有效的方法.
我目前在做什么的例子:
public class ClassA
{
private int x;
private int y;
public void Method1()
{
try
{
//Some code
}
catch(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public void Method2()
{
try
{
//Some code
}
catch (Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想做的例子:
public class ClassB : IUnhandledErrorHandler
{
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
void IUnhandledErrorHandler.OnError(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public interface IUnhandledErrorHandler
{
void OnError(Exception ex);
}
Run Code Online (Sandbox Code Playgroud)
注意: 此类是WCF项目中的服务,并实现ServiceContract.我已经尝试将ErrorHandler添加到服务的ChannelDispatcher中.但是,当错误到达ErrorHandler时,它已经超出了发生错误的类的范围,因此我无法访问类详细信息.
解:
public class ClassC
{
public ClassC()
{
AppDomain.CurrentDomain.FirstChanceException += OnError;
}
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
private void OnError(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
e.Exception.Data["x"] = x;
e.Exception.Data["y"] = y;
}
}
Run Code Online (Sandbox Code Playgroud)