代码改变世界

Silverlight代码协定和异常杂记

2010-09-12 11:15  撞破南墙  阅读(517)  评论(0编辑  收藏  举报

前置条件 

Contract.Requires( x != null ); 

旧式

if ( x == null ) throw new ...

Contract.EndContractBlock(); // All previous "if" checks are preconditions

 

代码协定提供一种使用代码指定前置条件、后置条件和对象固定条件的方式。前置条件是在输入方法或属性时必须满足的要求。后置条件描述代码退出时的预期的方法或属性。对象固定条件描述正常状态下的类的预期状态。

如果代码必须在前置条件失败时引发特定的异常,则可以使用 Requires 的泛型重载,如下所示。

Contract.Requires<ArgumentNullException>( x != null, "x" );

 

名称

说明

 

Assert(Boolean)

检查条件;如果条件为 false,则遵循为分析器设置的升级策略。

 

Assert(Boolean, String)

检查条件;如果条件为 false,则遵循由分析器设置的升级策略,并显示指定的消息。

 

Assume(Boolean)

指示代码分析工具假设指定的条件为 true(即使无法静态地证明该条件始终为 true)。

 

Assume(Boolean, String)

指示代码分析工具假设某个条件为 true(即使无法静态地证明该条件始终为 true),并在假设失败时显示一条消息。

 

EndContractBlock

当方法的协定仅包含 if-then-throw 形式的前置条件时,标记协定部分的结尾。

 

Ensures(Boolean)

为封闭方法或属性指定一个后置条件协定。

 

Ensures(Boolean, String)

为提供的退出条件指定后置条件协定,并指定条件为 false 时要显示的消息。

 

EnsuresOnThrow<(Of<<'(TException>)>>)(Boolean)

基于提供的异常和条件为封闭方法或属性指定一个后置条件协定。

 

EnsuresOnThrow<(Of<<'(TException>)>>)(Boolean, String)

基于提供的异常和条件为封闭方法或属性指定后置条件协定,并指定条件为 false 时要显示的消息。

 

Exists(Int32, Int32, Predicate<(Of<<'(Int32>)>>))

确定指定的测试对某个整数范围中的任何整数是否为 true

 

Exists<(Of<<'(T>)>>)(IEnumerable<(Of<<'(T>)>>), Predicate<(Of<<'(T>)>>))

确定函数中是否存在某个元素集合中的元素。

 

ForAll(Int32, Int32, Predicate<(Of<<'(Int32>)>>))

确定某个特定条件是否对指定范围内的所有整数都有效。

 

ForAll<(Of<<'(T>)>>)(IEnumerable<(Of<<'(T>)>>), Predicate<(Of<<'(T>)>>))

确定函数中是否存在某个集合中的所有元素。

 

Invariant(Boolean)

为封闭类指定一个固定协定。

 

Invariant(Boolean, String)

为封闭类指定一个固定协定,并在该协定的条件失败时显示一条消息。

 

OldValue<(Of<<'(T>)>>)

表示方法或属性开始时的值。

 

Requires(Boolean)

为封闭方法或属性指定一个前置条件协定。

 

Requires(Boolean, String)

为封闭方法或属性指定一个前置条件协定,并在该协定的条件失败时显示一条消息。

 

Requires<(Of<<'(TException>)>>)(Boolean)

为封闭方法或属性指定一个前置条件协定,并在该协定的条件失败时引发异常。

 

Requires<(Of<<'(TException>)>>)(Boolean, String)

为封闭方法或属性指定一个前置条件协定,并在该协定的条件失败时引发异常,其中包含提供的消息。

 

Result<(Of<<'(T>)>>)

表示一个方法或属性的返回值。

 

ValueAtReturn<(Of<<'(T>)>>)

表示从一个方法返回时 out 参数的最终(输出)值。

 

 

 和DUBUG类进行比较

 

 

 

名称

说明

 

Assert(Boolean)

检查条件,如果该条件为 false,则输出调用堆栈。

 

Assert(Boolean, String)

检查条件,如果该条件为 false,则显示指定的消息。

 

Assert(Boolean, String, String)

检查条件,如果该条件为 false,则显示指定的两条消息。

 

Assert(Boolean, String, String, array<Object>[]()[][])

检查条件,如果该条件为 false,则输出消息和调用堆栈。

 

WriteLine(Object)

使用 OutputDebugString 函数将指定对象的 ToString 方法的值写入调试器。

 

WriteLine(String)

使用 OutputDebugString 函数将指定的后跟行终止符的消息写入调试器。

 

WriteLine(String, array<Object>[]()[][])

使用 OutputDebugString 函数将后跟行终止符的带格式字符串写入调试器。

异常类和属性

Exception 类的若干属性使了解异常更容易。这些属性包括:

StackTrace 属性。

此属性包含可用来确定错误发生位置的堆栈跟踪。如果有可用的调试信息,则堆栈跟踪包含源文件名和程序行号。

InnerException 属性。

此属性可用来在异常处理过程中创建和保留一系列异常。可使用此属性创建一个新异常来包含以前捕捉的异常。原始异常可由 InnerException 属性中的第二个异常捕获,这使处理第二个异常的代码可以检查附加信息。

为提高调用方确定异常引发原因的能力,有时可能需要方法捕捉帮助器例程引发的异常,然后引发一个进一步指示已发生的错误的异常。可以创建一个更有意义的新异常,其中内部异常引用可以设置为原始异常。然后可以针对调用方引发这种更有意义的异常。请注意,使用此功能,可以创建以最先引发的异常作为结束点的一系列相链接的异常。

Message 属性。

此属性提供有关异常起因的详细信息。消息以引发异常的线程的 Thread..::..CurrentUICulture 属性所指定的语言显示。

Data 属性

此属性是可以保存任意数据(以键值对的形式)的 IDictionary