在没有过多样板的情况下处理 .NET (GUI) 事件函数中的异常?

发布于 2024-11-14 20:12:18 字数 484 浏览 0 评论 0原文

注意:我不经常进行 .NET 编程。通常我使用本机/MFC,所以我对如何在 C# 上下文中正确执行此操作感到有点迷失。

我们在本机 MFC 应用程序的上下文中显示.NET 控件。这意味着 GUI 线程是调用 .NET 控件的 WndProc 的本机线程。 (好吧,至少据我所知。)

显然,我们不想希望从我们的(GUI)事件处理程序中抛出异常,因为调用堆栈中没有适当的处理程序可以捕获异常他们。

据我所知,带有 AppDomain / UnhandledExceptionEventHandler 的解决方案在本机 MFC 应用程序中没有意义。 (如果我错了,请纠正我。)

那么回到问题:如何避免向 C# 控制代码的每个事件处理程序添加 try/catch 块?是否有某个地方(也许是 System.Forms...Control.WndProc?)可以捕获所有 .NET 异常并只向用户显示错误对话框?

Note: I don't do .NET programming regularly. Normally I do native/MFC, so I'm a bit lost as how to do this properly in the context of C#.

We're displaying .NET control in the context of a native MFC application. That means the GUI thread is a native thread calling into the WndProc of the .NET control. (Well, at least as far as I can tell.)

Obviously, we do not want to throw exceptions from our (GUI) event handlers, as there is no proper handler down the call stack that would catch them.

As far as I can tell, the solution(s) with AppDomain / UnhandledExceptionEventHandler do not make sense in a native MFC application. (Please correct me if I'm wrong.)

So back to the question: How can I avoid having to add a try/catch block to each event handler of the C# control code? Is there some place (System.Forms...Control.WndProc maybe?) where I can catch all .NET exceptions and just display an error dialog to the user?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷情妓 2024-11-21 20:12:19

您可以使用函数式方法来减少样板代码。编写如下函数:

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 参数,但您应该明白这个想法。

You can reduce boilerplate code by using a functional approach. Write a function like this:

public class Util
{
    public static void SafeCall(Action handler)
    {
      try
      {
           handler();
      }
      catch(Exception ex)
      {
         // process ex here
      }
}

And reuse it in every of your GUI event handlers:

void MyEvent(object sender, EventArgs e)
{
    Util.SafeCall(()=>NameOfYourHandlerMethod(sender,e));
};

or

void MyEvent(object sender, EventArgs e)
{
    Util.SafeCall(
    delegate
    {
      // enter code here
    });
};

This might need some additional work to get the sender/EventArgs parameters the way you want them, but you should get the idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文