我在代码中使用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
看起来很难看。
答案 0 :(得分:1)
没有必要执行try...catch
,任何抛出的异常都会冒出来,直到有人处理它们为止。
Debug.Assert
中的catch
只会在调试模式下引发异常。大多数情况下,您可以让调试器中断异常。
您应该对不变量使用断言,并且只需要引发其他异常,直到需要处理它们为止。
在您的情况下,我认为您无法处理异常。
最好让特定ArgumentException
替换Debug.Assert
,这样在发布模式下异常更有用,但在您的示例中,它既不在此处,也不在那里。< / p>