【问题标题】:Exception control when release an application?发布应用程序时的异常控制?
【发布时间】:2014-05-28 13:32:18
【问题描述】:

对某些人来说可能是一个显而易见的问题,但找不到重复的问题。

我正在打包我一直在开发的 Windows 窗体解决方案的最终版本,并准备好进行在线分发。这样做的最佳实践是什么?我们已经在打包安装文件时遇到了一些麻烦,并且在不同的 PC(包括 32 位和 64 位)上测试程序时遇到了障碍。

更具体地说,应该“扔;”命令在最终版本中被注释掉或留下?这会暴露解决方案本身的任何内部工作原理吗?

【问题讨论】:

  • 应该使用某种错误日志来处理异常,否则您几乎没有机会修复出现的任何错误
  • 所有异常都应该被处理;)它不会显示任何关于内部代码的重要信息,它只是一个 MessageBox 说 f.e. “NullReferenceException”,程序将崩溃。

标签: c# winforms exception-handling release


【解决方案1】:

发生异常时,已发布的应用程序不应崩溃。你会想通知用户,出了点问题并记录你的异常,但你不想崩溃!应以友好的方式通知用户,而不仅仅是将exception.ToString() 放入消息框中。

添加Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException 处理程序来处理应用程序中的所有异常是一个很好的做法。如何做到这一点,在以下线程中得到回答:Catch Application Exceptions in a Windows Forms Application 但是,请确保您的应用程序在可用状态下存活,即以适当的方式为您的应用程序处理异常。

我通常添加一个预处理器指令来处理应用程序级别的异常,因为我希望它们在调试时抛出。例如:

#if !DEBUG 
   Application.ThreadException += new ThreadExceptionEventHandler(MyHandler);
#endif

还应该提到,如果您有预期可能发生异常的代码片段,例如网络通信错误,您应该明确处理这些片段。我的意思是,我们不应该完全忘记异常处理,因为我们在应用程序级别配置了一个未处理的异常处理程序。

【讨论】:

    【解决方案2】:

    保持所有异常处理完好无损。

    在应用程序的起始表单中添加一个事件,附加到Application.UnhandledException 事件。如果异常在堆栈中传播,这将触发。

    这是通知用户应用程序已崩溃的点。在此处记录错误,然后优雅地中止。


    关于揭示内部结构的观点,由您决定。如果您愿意,您可以混淆源代码,但如果您在发布构建模式下发布,并且您没有提供 .PDB,那么这是第一步。

    最终,DLL / EXE 无论如何都可以反编译,这取决于您。调试模式会比发布模式显示更多信息,但不会更多。

    【讨论】:

      【解决方案3】:

      理想情况下,您应该使用throw; 捕获任何更高的东西。仔细检查您的代码并尝试确保正确处理引发的异常。记录未处理的异常 - 您可以在 Windows 事件查看器中查看此信息。根据您在其中添加的详细信息,未处理的异常可能会为您的应用程序的内部工作提供线索。但是,我建议未处理的异常是一个糟糕的信息来源,任何想知道您的应用程序如何工作的人都可以简单地反汇编它,除非您对其进行了混淆。

      使用try/catch 块的周围代码无法捕获某些异常,因此您的应用程序还应实现an unhandled exception handler。这使您有机会向用户显示错误消息并对异常执行某些操作 - 记录它、将其发送给支持人员、丢弃它等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多