如何获得线程异常来仅终止当前命令或 WinForms 应用程序?

发布于 2024-12-04 17:37:42 字数 175 浏览 1 评论 0原文

我的 .NET Windows 窗体应用程序有各种命令调用我的命令函数,这些函数可以抛出由我的处理程序在 Application.ThreadException 处处理的异常。我希望这个处理程序能够终止命令函数而不终止应用程序,即使在命令函数没有 try/catch 的情况下也是如此。获得这个的最好方法是什么?

谢谢。

My .NET Windows Forms app has various commands calling my command functions that can throw exceptions handled by my handler at Application.ThreadException. I would like this handler to terminate the command function without terminating the app, even in the case of a command function that has no try/catch. What's the best way to get this?

Thanks.

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

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

发布评论

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

评论(2

宁愿没拥抱 2024-12-11 17:37:42

另一个建议是使用 Task 类(因为它支持取消

Another suggestion is to use a Task class (as it supports Cancelation)

无人问我粥可暖 2024-12-11 17:37:42

最简单的方法是将每个“命令”包装在自己的 try/catch 块中,您可以以相当通用的方式执行此操作。只需在异常进入消息循环之前捕获该异常即可。因此,如果您之前:

public void ClickHandler(object sender, EventArgs e)
{
    ExecuteCommand("foo");
}

您会:

public void ClickHandler(object sender, EventArgs e)
{
    ExecuteInTryCatch(() => ExecuteCommand("foo"));
}

private static void ExecuteInTryCatch(Action action)
{
    try
    {
        action();
    }
    catch (Exception e)
    {
        // Log exception
    }
}

然而,值得注意的是,捕获所有异常通常不是一个好主意。如果可以的话,捕获非常具体的异常。

The simplest approach would be to wrap each of your "commands" in its own try/catch block, which you can do in a fairly generic way. Just catch the exception before it hits the message loop. So if before you had:

public void ClickHandler(object sender, EventArgs e)
{
    ExecuteCommand("foo");
}

you'd have:

public void ClickHandler(object sender, EventArgs e)
{
    ExecuteInTryCatch(() => ExecuteCommand("foo"));
}

private static void ExecuteInTryCatch(Action action)
{
    try
    {
        action();
    }
    catch (Exception e)
    {
        // Log exception
    }
}

It's worth noting, however, that catching all exceptions isn't usually a good idea. If you can, catch very specific exceptions instead.

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