相关疑难解决方法(0)

Application.ThreadException和AppDomain.CurrentDomain.UnhandledException有什么区别?

好吧,这很简单:

  • Application.ThreadException和之间有什么区别
    AppDomain.CurrentDomain.UnhandledException

  • 我需要处理两者吗?

谢谢!

.net c# exception-handling winforms

103
推荐指数
3
解决办法
3万
查看次数

如何正确捕获 WinForms 应用程序中所有未处理的异常

我想为 WinForms 应用程序中任何线程的所有未处理异常设置处理程序方法。我自己不创建任何应用程序域。

根据UnhandledException文档,我也需要UnhandledExceptionMode.ThrowException通过方法设置模式Application.SetUnhandledExceptionMode来捕获主线程的异常:

在使用 Windows 窗体的应用程序中,主应用程序线程中未处理的异常会导致引发 Application.ThreadException 事件。如果处理此事件,则默认行为是未处理的异常不会终止应用程序,尽管应用程序仍处于未知状态。在这种情况下,不会引发 UnhandledException 事件。可以通过使用应用程序配置文件或在挂接 ThreadException 事件处理程序之前使用 Application.SetUnhandledExceptionMode 方法将模式更改为 UnhandledExceptionMode.ThrowException 来更改此行为。这仅适用于主应用程序线程。UnhandledException 事件是针对其他线程中抛出的未处理异常而引发的

因此,生成的代码将如下所示:

    public static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
    {
        // ...
    }

    [STAThread]
    static void Main(string[] args)
    {
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler);

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm(pathToCheck));
    }
Run Code Online (Sandbox Code Playgroud)

可以吗?它会捕获来自任何线程(包括主线程、UI 线程和Task类创建的所有线程)的所有未处理的异常吗?我正确理解了文档吗?

是的,我在这里看到了这样的问题,但我不明白为什么我还应该使用以下代码:

Application.ThreadException += new     
  ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
Run Code Online (Sandbox Code Playgroud)

.net c# exception winforms

5
推荐指数
1
解决办法
7429
查看次数

设计应用程序范围的日志系统有哪些指导原则?

我正在学习分层架构,我想知道如何在这样的设计中添加日志系统.

现在让我们说我们有三层:

  1. 表达层
  2. 业务层
  3. 数据访问层

并假设只有更高级别的层知道下面一层的层.例如,表示层知道业务层,但不是相反.

你应该在哪里实现一般记录器类?

  1. 如果我在不同的项目中实现它,则意味着所有层都依赖于公共程序集,这可能是也可能不是.虽然这可以通过依赖注入来克服.
  2. 如果我在最高级别(在我们的例子中是表示层)中实现它,它将违反单一责任原则.

实施日志记录机制的好地方是什么?

在实施之后,使用这样一个系统的方法是什么?

  1. 理想情况下,它应该能够捕获未捕获的异常并在某处保存异常描述.
  2. 你应该在哪里捕获例外?它们应该被捕获在最高层(表示层)吗?或者他们应该被别人抓到?
  3. 用于将记录器传递给类的方法是什么?将方法/构造函数重载添加到接受类似接口的项目中的所有内容是否有意义ILogger

正如您所看到的,我对这个主题非常困惑,在我目前的工作中,没有人对企业应用程序设计/分层设计有任何了解,即使他们正在设计企业应用程序.所以任何帮助向我展示正确的方向将不胜感激.

c# logging enterprise design-patterns

2
推荐指数
1
解决办法
1637
查看次数