断言代码 - 在try catch中断言

时间:2016-02-02 22:54:28

标签: c#

我在代码中使用assert来验证假设并抛出给我很好的消息,如:

int IntegerDivide ( int dividend , int divisor )
{ 
    Debug.Assert ( divisor != 0 );
    return ( dividend / divisor ); 
}

(例如Assertions in Managed Code)。

现在我只是想知道我是否可以使用它来检查不应该抛出异常的代码。这样的事情可以做到:

try
{
    //code
}
catch (exceptionThatShouldntHappen ex)
{
   Debug.Assert(false,"This exception should never happen!")
}

这样做了吗?我的意思是,显然只有在有例外的代码才有意义,或者无论如何它都会破坏。但这就是重点,你可以想象调用代码会捕获大量异常,但有些异常并不意味着发生。无论调用者如何捕获它们,您都要确保这些异常总是在调试中中断。

  

我将更详细的例子:假设我有数据访问权限   类。它可以抛出各种异常。

     

因此调用代码将捕获异常。有时(或大多数时间?),调用代码将没有足够的信息或关注什么例外   可能。我的意思是,无论如何失败的FindRecord()都失败了。你抓住了   并返回错误页面或消息,甚至回退。

     

但是在数据访问逻辑中,不应该发生一些错误(假设文件未被发现,如果之前假定文件被检查过)。就是这样。你断言,所以无论上游代码如何捕获异常,它都会在调试期间中断 - 这无论如何都是断言。

最后,如果这种做法有意义,我想知道最好的方法是什么。在整个地方添加try-catch必须产生很大的影响(对于首先没有尝试捕获的方法)。 #if DEBUG周围的try-catch看起来很难看。

1 个答案:

答案 0 :(得分:1)

没有必要执行try...catch,任何抛出的异常都会冒出来,直到有人处理它们为止。

Debug.Assert中的catch只会在调试模式下引发异常。大多数情况下,您可以让调试器中断异常。

您应该对不变量使用断言,并且只需要引发其他异常,直到需要处理它们为止。

在您的情况下,我认为您无法处理异常。

最好让特定ArgumentException替换Debug.Assert,这样在发布模式下异常更有用,但在您的示例中,它既不在此处,也不在那里。< / p>