1 错误处理和异常处理
一般地,在程序运行中 ITK 使用异常处理来处理错误。异常处理是 C++语言中的一个标准部分,通常按以下形式来阐明:
try
{
//...try executing some code here...
}
catch ( itk::ExceptionObject exp )
{
//...if an exception is thrown catch it here
}
正如以下程序所论证的那样, 这里一个特定的类将抛出一个异常(这是 itk::ByteSwapper中的一段代码):
switch( sizeof(T))
{
//non-error cases go here followed by error case
default:
ByteSwapperError e (__FILE__, __LINE__);
e.SetLocation("SwapBE");
e.SetDescription("Cannot swap number of bytes requested");
throw e;
}
注意:itk::ByteSwapperError 是 itk::ExceptionObject 的一个子类(事实上,ITK 中所有
的异常都是从 ExceptionObject 演绎出来的)。在这个例子中,一个特定的结构和 C++预处理程序变量 FILE 和 LINE 用来实例化异常对象并为用户提供附加信息。你可以选择抓住一个特定的异常并因此得到一个特定的 ITK 错误,或者你可以通过抓住异常对象来捕获 ITK异常。
2 事件处理
ITK 中的事件处理使用 Subject/Observer 设计模式来执行(有时涉及 Command/Observer设计模式)。在这一方式中,对象通过注册它们正在观察的实例,来关注这个特定实例所调用的一个特定的事件。例如:ITK 中的滤波器周期性地调用 itk::ProgressEvent。当事件发生时对象已经记录下在这一事件中通报的信息。在记录过程中,通过调用一个命令来发出通告是特定的(例如:函数回收、方法调用等)(注意:ITK 中的事件是 EventObject 的子类;查看 itkEventObject.h 可以得到确定的可能事件)。
例如: ITK 中的许多对象在运行时将从 ProcessObject 调用特定事件:
this->InvokeEvent( ProgressEvent( ) );
为了观察这一事件,注册需要结合事件Object::AddObserver( ) 方法中的一个命令(例
如:回收函数):
unsigned long progressTag =
filter->AddObserver(ProgressEvent( ), itk::Command*);
当事件发生时,所有注册观察者经过调用相应的 Command::Execute( )方式来通告。注意到命令中的许多子类能支持如C类型函数的常数和非常数成员函数(查看Common/Command.h 得到 Command 的预定义子类。如果找不到合适的,可以选择derivation)。