UML异常,在行为建模中往往需要处理许多例外的情况。面向对象编程语言中提供了异常处理机制,UML 2也提供了异常处理器来对异常进行建模。
一个异常表示发生某种不正常的情况而停止了不正常的执行过程。在下面几种情况下可能发生异常。
- 可能是由于底层执行的行为错误而引起。例如,访问数组的下标超界,除数为零等情况。
- 可能由一个引发异常的动作而显式引起。UML 2中有一种特殊的动作称为“引发异常”,它的执行将引发指定类型的异常,这类似于编程语言中使用throw语句抛出的异常。
为了使程序能正确响应各种异常,就必须知道发生了哪种异常,以及该异常的属性。将异常建模为对象就能很好地解决此问题。将特定时间发生的一个异常看作一个对象,而一种异常具有相同的对象种类,反映了异常的本质特性。这就出现了专门表示异常的类型层次。例如,C++
中的Exception类。UML 2虽然没有提供专门的异常类型,但提供了异常处理器。
异常处理器是一种特殊的建模元素,它有一个保护节点,而且确定一个异常处理执行体和一个异常类型。当保护节点发生特定类型的异常时,该执行体就执行,主要包括如下几方面内容。
- 一个异常处理器关联一个被保护节点,该节点可以是任何一种可执行节点。如果一个异常被传播到该节点外,此处理器将检查是否匹配异常类型。
- 一个异常处理器有一个可执行节点作为执行体,如果该处理器与异常类型相匹配,就执行。
- 一个异常处理器必须说明一种以上异常类型,表示该处理器所能捕捉的异常种类。如果所引发的异常类型是其中之一或者子类型,那么该处理器将捕捉该异常,而且开始执行执行体中的动作。
- 一个异常处理器还需要一个对象节点作为异常输入,往往表示为该处理器的一个对象节点。当处理器捕获一个异常时,该异常的控制流就放在此节点上,从而导致异常体的执行。
例如,下图为一个异常处理器的示例。其中一条异常使用“闪电”流从一个被保护节点指向一个异常处理器的节点,该节点表示能捕获的一种异常类型。
上图表示了被保护节点执行中如果出现异常,异常对象将沿着控制流传递给处理器。如果异常对象的类型与捕获的类型相同,则处理器的执行体就执行,而被保护节点的行为被终止。这种表示方式与编程语言中的try catch语言相似。
一个保护节点也可能引发多种类型的异常。例如,在下图中如果发生“异常类型1”异常时,将被一个处理器捕获,并提供一个“结果1”作为输出;当发生“异常类型2”异常时,将被另一个处理器捕获,并提供一个“结果2”作为输出。如果没有异常发生,被保护节点就正常结束,进入下面的“输出结果”节点。当发生以上两种异常之一时,“输出结果”节点将使用异常的输出作为结果执行。
酷客网相关文章:
评论前必须登录!
注册