注意:我不定期进行.NET编程。通常我会使用native / MFC,所以我在C#的上下文中如何正确地执行此操作有点迷失。
我们在 native MFC应用程序的上下文中显示.NET控件。这意味着GUI线程是调用.NET控件的WndProc的本机线程。 (好吧,至少据我所知。)
显然,我们不想要从我们的(GUI)事件处理程序中抛出异常,因为调用堆栈中没有适当的处理程序可以捕获它们。
据我所知,AppDomain
/ UnhandledExceptionEventHandler
的解决方案在本机MFC应用程序中没有意义。 (如果我错了,请纠正我。)
回到这个问题:我怎样才能避免为C#控制代码的每个事件处理程序添加一个try / catch块?是否有一些地方(System.Forms ... Control.WndProc可能吗?),我可以捕获所有.NET异常并只向用户显示一个错误对话框?
答案 0 :(得分:2)
您可以使用功能方法来减少样板代码。写一个这样的函数:
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参数,但你应该明白这一点。