很快,我想知道以下哪项是更好的做法:
TRY/CATCH
块中并显示错误消息正如我所读到的,TRY/CATCH
块不处理所有类型的错误。在我看来,这不是问题。
我正在构建执行特定存储过程的动态SQL。我可以自己制作支票:
或只是封装这样的语句:
BEGIN TRY
EXEC sp_executesql @DynamicSQLStatement
SET @Status = 'OK'
END TRY
BEGIN CATCH
SET @Status = ERROR_MESSAGE()
END CATCH
如果我自己进行检查(例如性能差异)或者我应该将此工作留给服务器,是否有任何区别?
我问的原因是因为在某些语言(如JavaScript)中使用try/catch
块被称为不良做法。
答案 0 :(得分:4)
通常,自己检查这些内容比让SQL Server捕获异常更好。正如我在这些帖子中所展示的那样,异常处理并不便宜:
Checking for potential constraint violations before entering SQL Server TRY and CATCH logic
Performance impact of different error handling techniques
根据您所期望的架构,数量,并发性和故障频率,您的临界点可能会有所不同,因此在非常高的范围内,这可能并不总是绝对最有效的方式。但除了大多数情况下你最好的事情,编写自己的错误处理和预防 - 虽然需要时间 - 让你完全理解你的所有错误条件。
所有人都说,你应该仍然有TRY / CATCH
作为故障保护,因为总有一些你无法预测的异常,并且让它优雅地爆炸比在任何地方投掷弹片要好得多。
答案 1 :(得分:0)
try / catch仅应用于严重错误。如果您可以通过执行简单的if语句来阻止可能的错误,那么您应该这样做。例如,不要依赖try / catch来确保用户以正确的格式输入日期。检查一下你自己。
就个人而言,如果我得到类似的关键异常,我更愿意看到调用堆栈及其发生的位置。所以,我只在我项目的最顶层做一个try / catch。
答案 2 :(得分:0)
使用Try Catch Block你仍然可以提出自定义错误消息,实际上如果你有自定义错误消息那么你只能显示自定义错误消息你不能sql server默认错误消息。您还可以使用许多其他错误函数来获取有关错误的更多信息,例如
ERROR_LINE()
ERROR_MESSAGE()
ERROR_STATE()
ERROR_NUMBER()
ERROR_STATE(),
这些函数只能在TRY / CATCH块的Catch块中使用,并且作为开发人员可以让我们的生活更轻松:)