在开发模块化应用程序时,我们显然需要使用抗故障系统吗?
当创建模块时,如果存在模块无法处理的错误条件,它应该报告错误(比如抛出异常.),而不必担心谁来处理它。看起来,这可以作为开发模块的指导方针。这有什么问题吗?
编辑:示例
In 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;
//}
}
}发布于 2012-04-24 16:49:44
我可以看到有两类关键的例外情况:一种是整个系统可能已经被破坏了,另一种是没有什么可以安全地假定是不安全的,而在这些情况下,系统的一个重要方面--代码将“正常工作”--不会被破坏,但我们没有理由相信系统的其他部分受到了破坏。在前一种情况下,程序除了死没有太多的功能,可能会尝试记录发生的事情,如果它能够这样做而不破坏任何“主线”数据的话。然而,在后一种情况下,扼杀应用程序是“不恰当的”。更好的方法是设计子系统,以便代码能够“拔下插头”,防止它造成数据损坏,其结果是,任何进一步使用它的尝试(除了返回值应该表明问题所在的“您仍在工作”查询之外)可能会抛出一个立即异常,但允许程序中那些不需要问题子系统继续运行的部分继续运行,除非或直到他们决定没有问题才能使用它。
发布于 2012-04-24 12:02:11
一个故障快速模块将处理错误的责任(但不是检测错误)传递给下一个更高的系统设计级别的。
维基百科的定义。什么是“更高的系统设计水平”。这不应该至少是一个报告故障的水平,这样才能采取纠正措施并解决问题吗?或者在使用类的客户端代码提供的上层实现。或者是通过AppDomain.UnhandledException调用的通用错误报告。都完全超出你的控制范围。
抛出一个异常。
发布于 2012-04-24 11:49:57
通常,在C++中,当我通常实现一个关键错误方案时,我甚至不允许这样的严重异常离开异常处理程序--我将全局访问类实例的'criticalExit()‘方法称为’criticalExit()‘方法(我通常有一个这样的方法来存储“全局”方法等等)。记录器、对象池),除了异常和字符串( string通常只是模块和函数名)。criticalExit()锁定互斥锁,将其优先级提高到‘ExitProcess_优先级_TIME_ exception’,打开'CriticalError.Log',将异常消息和字符串追加到文件中,关闭它并调用ExitProcess(1),(Environment.Exit(1))。
..and,我只是想看看,我在C#上试过这样做。生成一个可全局访问的单个实例并不容易:(
https://stackoverflow.com/questions/10296961
复制相似问题