注意:我不经常进行.NET编程。通常我使用本机/MFC,所以我有点不知道如何在C#的上下文中正确地执行此操作。
我们在本机MFC应用程序的上下文中显示.NET控件。这意味着GUI线程是一个调用.NET控件的WndProc的本机线程。(好吧,至少据我所知。)
显然,我们不想从(GUI)事件处理程序中抛出异常,因为调用堆栈中没有合适的处理程序可以捕获它们。
据我所知,具有AppDomain
/UnhandledExceptionEventHandler
的解决方案在本机MFC应用程序中没有意义。(如果我错了,请纠正我。)
那么回到问题上来:如何避免在C#控制代码的每个事件处理程序中添加try/catch块呢?有没有什么地方(可能是System.Forms…Control.WndProc?)可以捕捉所有.NET异常并向用户显示错误对话框?
您可以通过使用函数方法来减少样板代码。编写这样的函数:
public class Util
{
public static void SafeCall(Action handler)
{
try
{
handler();
}
catch(Exception ex)
{
// process ex here
}
}
并在每个GUI事件处理程序中重用它:
void MyEvent(object sender, EventArgs e)
{
Util.SafeCall(()=>NameOfYourHandlerMethod(sender,e));
};
或
void MyEvent(object sender, EventArgs e)
{
Util.SafeCall(
delegate
{
// enter code here
});
};
这可能需要一些额外的工作来获得你想要的sender/EventArgs参数,但你应该知道。