1

在开发模块化应用程序时,我们需要使用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;
       //}
    }
 }
4

3 回答 3

2

我可以看到两类严重异常:其中整个系统可能已被破坏,并且没有太多可以安全假设的情况,以及那些代码正在运行的系统的重要方面期望“正常工作”,不会,但没有理由相信系统的其他部分受到损害。在前一种情况下,除了死机之外,程序实际上并没有什么可以做的,如果它可以在不破坏任何“主线”数据的情况下记录发生的事情,则可能会尝试记录发生的事情。但是,在后一种情况下,终止应用程序将过于“粗鲁”。恕我直言,更好的方法是设计子系统,以便代码可以“拔掉插头”以防止它导致数据损坏,

于 2012-04-24T16:49:44.203 回答
1

快速故障模块将处理错误但不检测错误的责任传递给下一个更高的系统设计级别

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

抛出异常。

于 2012-04-24T12:02:11.373 回答
0

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

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

于 2012-04-24T11:49:57.843 回答