我正在浏览别人的代码,有很多这样的代码:
try
'Logic here
catch e as exception
throw
end try
我相信TRY和CATCH原因是没有意义的(它们可能用于调试)。有没有一种情况下,这样的编码是一种良好的实践?
有一个全局偶数处理程序(global.asa)
我同意这些子句是毫无意义的,更糟糕的是,它们给你的代码增加了混乱,只会增加混乱。
更糟糕的是:如果他们执行Throw e
而不是Throw
,那么原始异常的堆栈将丢失。
No。没有理由去尝试……只会扔出去的接球。如果你想在异常发生的那一刻调试和捕获异常,你应该在Visual Studio中停止框架异常(debug菜单-> exceptions…)。
在我继承的一个程序中有完全相同的事情,它实际上更糟,因为在c#中捕获是昂贵的(只有尝试是免费的)。我坚持每天删除一打这样的标签,再过几个星期就可以完成了。
一般来说,您不希望这样做(并且您也不想捕获System.Exception
)。
也就是说,在某些情况下,您可能希望在调用堆栈的更上层Throw
异常,并在其他地方Catch
异常。下面是一个简单的例子:
Try
' Do some stuff here. For this example, let's assume
' it cannot cause any exceptions
Try
' Do some other stuff here that CAN cause an exception
Catch innerEx as Exception
' Rethrowing so that the outer block handles this
Throw
End Try
Catch ex as Exception
MessageBox.Show("I just caught an exception.")
End Try
如果你做了这样的事情,常识告诉你应该加上注释,说明你为什么这样做。
正如我所说,这是一个过于琐碎的例子,但更常见的用法可能是,您有一个方法调用另一个方法,并且您希望第一个方法处理第二个方法可能抛出的任何异常。如果您将Try/Catch
块留在第二个方法之外而不是重新抛出,则行为将是相同的,但是Try/Catch
和注释使您的意图更加明显。
编辑:如果您知道哪一行代码可能会抛出异常,那么在该行上面加上注释可能比添加Try/Catch
块更可取。