在开发模块化应用程序时使用Fail-fast方法

时间:2012-04-24 11:28:01

标签: c# wpf exception-handling error-handling modularity

开发模块化应用程序时,显然我们需要使用Fail-fast系统吗?

当创建模块时,如果模块无法处理错误条件,则应报告错误(如抛出异常..),而不必担心谁将处理它。看起来这可以在开发模块时用作指南。这有什么问题吗?

修改:实例

在module.dll中

public class SomeClass:ISomeInterface
{

    public void CreateFile(string filename)
    {
       //The module have no idea who calls this. But there is something wrong        
       //somewhere so  throw an exception early. The module writer has no control over 
       //how the exception is handled. So if this exception is not handled by the 
       //Client Application the application can potentially crash.Do he need to worry 
       //about that?
       if(filename == null)
       {
          throw new ArgumentNullException("Filename is null");
       }

       //I think the following is bad. This code is making sure that a module 
       //exception wont crash the application.Is it good?
       //if(filename ==null)
       //{
       //Logger.log("filename is null");
       //return;
       //}
    }
 }

3 个答案:

答案 0 :(得分:2)

我可以看到两类关键异常:整个系统可能已经被泄露的那些类别,并且没有一个人可以安全地假设不是,以及系统的一个重要方面代码期望“正常工作”,不会,但没有理由相信系统的其他部分受到损害。在前一种情况下,程序除了死亡之外没有太多可以做的事情,可能会尝试记录发生的事情,如果它可以这样做而不破坏任何“主线”数据。然而,在后一种情况下,杀死申请将是过分“粗鲁”。一个更好的方法是恕我直言,设计子系统,以便代码可以“拉动插件”,以防止它导致数据损坏,结果是任何进一步尝试使用它(除了“你还在工作”查询,其返回值应该表明问题)可能会立即引发异常,但允许程序中那些不需要故障子系统的那些部分继续运行,除非或直到他们认为对他们来说没什么用处没有它。

答案 1 :(得分:1)

  

故障快速模块将处理错误的责任(但未检测到它们)传递给次高级系统设计级

来自维基百科的定义。 究竟是什么“下一个更高的系统设计级别”。如果这不是至少报告失败的水平,那么有人可以采取纠正措施并解决问题吗?要么是在使用您的类的客户端代码提供的上层中实现的。或者通过AppDomain.UnhandledException调用的通用错误报告器。两者都完全不受你的控制。

抛出异常。

答案 2 :(得分:0)

通常,在C ++中我通常实现一个关键错误方案,我不会让这些关键异常甚至离开异常处理程序 - 我称之为全局可访问类实例的'criticalExit()'方法,(我通常有一个存储'全局'方法等,例如记录器,对象池),异常和字符串,(字符串通常只是模块和函数名称)。 criticalExit()锁定互斥锁,将其优先级提高到'THREAD_PRIORITY_TIME_CRITICAL',打开'CriticalError.Log',将异常消息和字符串追加到文件中,关闭它并调用ExitProcess(1),(Environment.Exit(1)) 。

..而且,只是为了看,我试过用C#做这个。生成一个全局可访问的单个实例并不容易:(