using Fail-fast approach when developing modular applications
在开发模块化应用程序时,我们是否需要使用快速故障系统?
在创建模块时,如果存在模块无法处理的错误条件,则应报告错误(如引发异常..),而不必担心谁将处理该错误。看起来这可以作为开发模块时的指导方针。这有什么问题吗?
编辑:实例
在DLL模块中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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; //} } } |
我可以看到两类重要的异常:一类是整个系统可能已经被破坏了,而我们可以安全地认为没有什么,另一类是系统的一个重要方面,即代码将要"正常工作",但没有理由相信系统的其他部分重新妥协。在前一种情况下,除了死区之外,程序实际上不能做太多的工作,如果它能够做到这一点而不破坏任何"主线"数据,那么可能会尝试记录所发生的事情。但是,在后一种情况下,终止应用程序将是不适当的"粗鲁"。更好的方法是设计子系统,这样代码就可以"拔掉"子系统上的插头,以防止它导致数据损坏,从而导致任何进一步尝试使用它(而不是返回值应该表明问题的"您还在工作"查询)都可能引发立即的异常,但允许这些PA不需要故障子系统继续运行的程序的RTS,除非或直到他们决定没有它没有什么可做的。
A fail-fast module passes the responsibility for handling errors, but not detecting them, to the next-higher system design level.
从维基百科的定义。"下一个更高的系统设计水平"到底是什么?这不应该至少是一个报告失败的级别,以便有人能够采取纠正措施并解决问题吗?或者在使用类的客户机代码提供的上层实现。或通过AppDomain.UnhandledException调用的一般错误报告程序。都完全失控了。
引发异常。
通常,在C++中,通常我会执行一个关键的错误方案,我不让这些关键异常甚至离开异常处理程序——我称之为"全局访问类"实例的"临界AlxIt()"方法(我通常有一个来存储"全局"方法,例如日志记录器、对象池),除此之外,还有一个字符串(通常是字符串)。只有模块和函数名)。critical exit()锁定互斥体,将其优先级提高到"threadu priorityu timeu criticalerror.log",将异常消息和字符串附加到文件,关闭它并调用exitprocess(1),(environment.exit(1))。
…而且,只是想看看,我试过用C来做这个。生成一个全局可访问的单个实例并不容易:(