设为首页 加入收藏

TOP

10.5.3 什么是逻辑容错(2)
2013-10-07 12:59:43 来源: 作者: 【 】 浏览:71
Tags:10.5.3 什么 逻辑 容错

10.5.3  什么是逻辑容错(2)

这里,concurrent_file_access_exception继承了runtime_error,并通过增加许多数据成员和成员函数使其特化。特别地,增加了takeCorrectiveAction( )。这个方法可用来帮助异常处理程序执行它的恢复和纠正工作。file_access_exception对象知道如何识别死锁以及如何打破死锁。死锁是并行编程(www.cppentry.com)的主要挑战之一。它还有专门的逻辑来处理能破坏文件的病毒。它还有着专门的知识来处理意外中断的文件传输。这些情况都能够引发运行时异常。您可将concurrent_file_access_exception对象和C++(www.cppentry.com)的throw、catch和try共同使用。例如:

  1. try{  
  2.     //...  
  3.     fileProcessingOperation();  
  4.     //...  
  5. }  
  6.  
  7. catch(concurrent_file_access_exception  &E)  
  8. {  
  9.     cerr << E.what() << endl;  
  10.     cerr << E.detailedExplanation() << endl;  
  11.     E.takeCorrectiveAction();  
  12.     // Handler Take Additional Corrective Action  
  13.     //...  

保护异常类不发生异常

当一些软件组件遇到软件或硬件异常时,会抛出异常对象。但注意,异常对象自身不抛出异常。这有很多含义。在多线程或多处理环境中设计处理程序时需特别注意。若异常处理过于复杂,以至于潜在导致其他异常的产生,那么就需重新设计异常处理并尽可能做简化。如果异常处理代码能够产生异常,那么异常处理器制会没有必要地变得很复杂。因此,多数异常类中包含了空的throw( )方法。

  1. // Class declaration for exception class  
  2.  
  3. class exception {  
  4. public:  
  5.    exception() throw() {}  
  6.    exception(const exception&) throw() {}  
  7.    exception& operator=(const exception&) throw() {return *this;}  
  8.    virtual ~exception() throw() {}  
  9.    virtual const char* what() const throw();  
  10. }; 

注意,throw( )的声明中参数为空。空的参数说明该方法不能够抛出异常。如果方法试图抛出异常,将会产生一个编译时错误消息。如果基类无法抛出异常,那么相应的方法在任何派生类中都将无法抛出异常。

2. 实现逻辑容错的简单策略

在最简单的形式下,实现模型为应用程序的PBS架构中的每个谓词创建一个C++(www.cppentry.com)谓词。此时,将为每个谓词创建一个谓词异常类(可能从logic_error类派生)。如果因为一些未知的和不可控的原因,关于某个谓词的假设、断言或命题是矛盾的,那么就抛出该谓词的异常类。在多数情况下,这意味着应用程序将体面地退出。这时应当退出,因为如果PBS中的一个或多个谓词是矛盾的,那么应用程序不具有相同的含义,已经违背了并发基本结构的完整性。谓词异常类担当着基于逻辑的不变式的角色,用它来保证PBS与应用程序的一致性。显然,谓词异常处理程序知道当它的异常被抛出时应当做些什么。

例如,如果guess_it程序确定没有足够的agent来生成足够的猜测以赢得游戏,是否应当抛出valid_code异常?或者缺乏足够的agent是一个普通的软件错误,因此应当由错误处理而不是异常处理来解决?答案是缺少足够的agent在本例中不是普通的软件错误,因为软件的基本操作是获取足够的agent去及时地猜测编码。若无法获取足够的agent,任务将失败。单元测试过程应当暴露它,谓词异常处理程序用来辅助单元测试的质量。所以,逻辑容错在本例中完成两个重要的任务。

(1) 使应用程序体面地退出(或到其他可接受的状态)。对于多agent和黑板架构,这包括:

将agent和知识源解散或退出

归还黑板资源和通信线路

释放对任何共享数据、同步或通信组件的占用

(2) 阻止应用程序在不合理的状态中继续运行,从而防止应用程序犯更多的错误。

特别地,逻辑容错的第二个任务是帮助构建和加强基于声明式的架构。

3. 测试与逻辑容错

典型情况下,异常处理器制被用来防止程序简单地崩溃。C++(www.cppentry.com)异常处理器制支持终止模型(termination model)。终止模型中提倡的是体面地退出。但是,经常会在某些灾难性事件发生时终止应用程序。尽管在没有严格按照PBS时,多线程或多处理应用程序有可能继续运行,但是您应将任何对PBS的背离视为灾难性的,因为应用程序的逻辑结论(含义)是其谓词、命题、公理和陈述的总和。这些谓词构成了应用程序的逻辑参数。如果断言或谓词之一的结果为false,那么应用程序在该位置是不合理的。您希望在测试阶段发现所有不合理的行为,并使用逻辑容错语义来帮助实现这一目的。C++(www.cppentry.com)谓词和谓词异常的联合使用是达到声明式并行编程(www.cppentry.com)方法的重要部分。尽管目的是在测试阶段找出所有的缺陷,但这并不总是可以实现的。所以,在C++(www.cppentry.com)异常处理的典型用法基础上增加了逻辑容错。逻辑容错的目的是不允许程序有任何后果是在PBS给出的后果之外的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇10.3.2 缺陷排除与缺陷存活 下一篇10.5.3 什么是逻辑容错(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: