C# 在单个线程中运行的多方法表单的异常处理方法

C# 在单个线程中运行的多方法表单的异常处理方法,c#,winforms,exception,exception-handling,C#,Winforms,Exception,Exception Handling,我正在编写一个面向表单的应用程序,它有许多控制和操作。 通常,每个控件都与涉及应用程序其他对象的操作(函数)相关联,这些对象通常应在调用点初始化 但是,一些scnarios可能会导致一个或多个对象为空的状态,因此使用它们会导致异常 问题是,除了用try/catch块包装表单的每个方法外,它的填充方式似乎有更好的方法来处理此问题。您可以使用听起来有点混乱的捕获所有未处理的异常。 通过向program.cs文件中的AppDomain.CurrentDomain.UnhandledException添

我正在编写一个面向表单的应用程序,它有许多控制和操作。 通常,每个控件都与涉及应用程序其他对象的操作(函数)相关联,这些对象通常应在调用点初始化

但是,一些scnarios可能会导致一个或多个对象为空的状态,因此使用它们会导致异常


问题是,除了用
try/catch
块包装表单的每个方法外,它的填充方式似乎有更好的方法来处理此问题。

您可以使用听起来有点混乱的捕获所有未处理的异常。 通过向
program.cs
文件中的
AppDomain.CurrentDomain.UnhandledException
添加和eventhandler,可以捕获所有异常。这将使你不用包罗万象。 然而,这不是真正的解决办法。只有在能够成功地处理异常时,才应该处理异常,并且应该尽可能地处理问题的局部性

例如,如果您有一个用户界面,允许您在一个操作中创建消息 然后是一个按钮,在另一个邮箱中发送

“电子邮件”按钮应检查是否有消息,或者仅在已创建消息时才应启用。 您不应该因为它的存在而使用try-catch,这应该是因为找不到邮件服务器,这是您无法在代码中处理的异常情况


因此,虽然您可以在其中放入一个顶级异常处理程序,并以“对不起,我不能这样做”作为响应,但如果它经常发生,则不会使您的代码变得更好,您应该看到,这是一个异常

在提供的类型和来源信息最一般化或最不具体的情况下,在异常的最高级别捕获异常不是一个好的做法。您必须捕捉异常发生的地方,尤其是尽可能具体地做出反应。这意味着:尝试分别过滤每个可能的异常


但是,在(原始)异常处理成为焦点之前(例如,nullArgumentException或InvalidDexException),最好通过检查代码内部可能存在的问题或/或编写单元测试来发现更多可能存在的问题,从而防止它们。当使用状态未知的对象时,请检查null。如果类型未知,请在使用前检查类型。在使用索引之前,请检查它是否在边界内。。。希望这能有所帮助。

很难将这样的事故定性为错误。你可以使用Lazy类来让它更容易正确。嗯,是的,但是你怎么处理它们呢?随便你:)我记录它们。你可以“沉默”他们或任何其他人只是有一种可怕的感觉,有人会用你的答案吞下很多,然后继续下去,这很快就不那么愉快了。。。