捕获异常而什么都不做是可以的吗?
本文关键字:什么 捕获异常 | 更新日期: 2023-09-27 17:53:15
try
{
CallMethod()
}
catch { }
根据我的经验,我一般不会这么做。
但是如果我有一个功能,说,使用第三方COM程序集偶尔失败,它实际上并不重要,不足以记录它,因为我将在几秒钟内再次调用它,这样做是可以的吗?
如果没有,我有什么选择?
当然有时会有,但应该是有意为之。
在这种情况下,您的最佳实践是在catch块中留下注释,以确保它是故意为空的。
不应该使用如图所示的空catch块。
例如,你的问题中的代码也将捕获OutOfMemoryException, StackOverflowException, ExecutionEngineException, AccessViolationException和ThreadAbortException(尽管后者将在catch块的末尾被重新抛出)。它甚至可以捕获不从System派生的对象。异常(罕见,但可能在托管c++和JavaScript中…在CLR中,任何对象都可以被"抛出",但c#限制你只能抛出异常派生类型。
如果,在你的例子中,你正在使用第三方COM对象,偶尔失败,你不关心这些失败,你应该代替catch (COMException){},这样其他更严重的失败'冒泡',可以记录和/或修复。
只捕获那些实际上可以处理的异常是很重要的(在这种情况下,您显式地选择不处理由CallMethod()引起的异常,我同意应该添加注释来指示这种设计决策)。通过遵循该指导,您可以防止代码或运行时环境中的其他错误和问题被忽视。
我至少会在catch块中使用"Warning"或更低级别记录事件,这样您就可以随时启用日志记录,并在需要时查看发生了什么。
一般情况下,您希望设计代码以某种方式处理错误。
也就是说,如果你愿意默默承担失败的后果,那就去做吧。
第三方组件失败。它是如何失败的?它是否以一种始终可预测的方式失败(虽然时间不稳定)?你有TakingABreakException
吗?如果是这样,捕获可预测的异常,对它做任何你想做的事情,记录它,等等,,让其他的一切都冒出来。
我认为捕获异常总是一个好主意,特别是如果您知道它是什么,那么最具体的异常。我遇到过无数从未被捕获的错误,因为代码直接通过catch运行,因为它是空的,或者有人在那里放了一个返回。