Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Try-catch用途不明_Sql_Try Catch - Fatal编程技术网

SQL Try-catch用途不明

SQL Try-catch用途不明,sql,try-catch,Sql,Try Catch,假设我想通知应用程序发生了什么/返回了SQL server。让我们使用以下代码块: BEGIN TRY -- Generate divide-by-zero error. SELECT 1/0; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() as Erro

假设我想通知应用程序发生了什么/返回了SQL server。让我们使用以下代码块:

BEGIN TRY
    -- Generate divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
     SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;
END CATCH;
GO
SELECT 1/0;
让我们来看看这个代码块:

BEGIN TRY
    -- Generate divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
     SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;
END CATCH;
GO
SELECT 1/0;
我的问题是: 两者都返回零除错误。我不清楚的是,当我在这两种情况下都出现错误时,为什么我应该用try-catch子句来围绕它?
在这两种情况下,此错误是否都会传播到客户端应用程序?

否,通过在TRY/CATCH块中执行
Select 1/0
,Select语句将不返回任何内容,CATCH块中的Select语句将优雅地显示错误详细信息。查询成功完成-未引发任何错误

如果您自己运行
Select 1/0
,则查询不会成功完成-它会弹出一个错误

在SQL中使用catch块可以让您有机会在那里对它做些什么,而不仅仅是让错误冒泡到应用程序


您看到错误详细信息的唯一原因是您正在选择它们。如果Catch块中没有代码,您将看不到任何错误信息。

否,通过在TRY/Catch块中执行
Select 1/0
,Select语句将不返回任何内容,Catch块中的Select语句将优雅地显示错误详细信息。查询成功完成-未引发任何错误

如果您自己运行
Select 1/0
,则查询不会成功完成-它会弹出一个错误

在SQL中使用catch块可以让您有机会在那里对它做些什么,而不仅仅是让错误冒泡到应用程序

您看到错误详细信息的唯一原因是您正在选择它们。如果Catch块中没有代码,则不会看到任何错误信息

两者都返回0的除法 错误

是的,但是使用不同的返回路径

不同之处在于,在第一个示例中,您预测了错误并以某种方式处理它。错误作为常规结果进入应用程序-它不会通过错误处理机制传播。事实上,如果应用程序看起来不像结果的形状,那么它可能不知道发生了错误

在第二个实例中,错误通常会通过错误报告机制(如异常)传播到应用程序。这将中止操作。这种影响有多大取决于应用程序的异常处理。可能它只会中止当前操作,或者整个应用程序可能会失败,这取决于应用程序的设计和对异常的容忍度

您可以选择对您的应用程序有意义的内容。应用程序是否可以有意义地处理错误?如果是,传播错误(第二个示例),或者最好在查询中处理错误(第一个示例),通过返回默认结果(例如空行集)来“平滑”错误

两者都返回0的除法 错误

是的,但是使用不同的返回路径

不同之处在于,在第一个示例中,您预测了错误并以某种方式处理它。错误作为常规结果进入应用程序-它不会通过错误处理机制传播。事实上,如果应用程序看起来不像结果的形状,那么它可能不知道发生了错误

在第二个实例中,错误通常会通过错误报告机制(如异常)传播到应用程序。这将中止操作。这种影响有多大取决于应用程序的异常处理。可能它只会中止当前操作,或者整个应用程序可能会失败,这取决于应用程序的设计和对异常的容忍度


您可以选择对您的应用程序有意义的内容。应用程序是否可以有意义地处理错误?如果是,传播错误(第二个示例),或者在查询中处理错误最好(第一个示例),通过返回默认结果(例如空行集)来“平滑”错误。

使用第一种方法,您不会直接从SQL Server获取错误

第二个方法可以停止执行它后面的语句


因此,最好提前捕获它,使用第一种方法,您不会直接从SQL Server获取错误

第二个方法可以停止执行它后面的语句


因此,您最好提前捕获它

是的,尝试捕获(如在普通代码中)的唯一原因是您是否可以“处理”错误,即,您可以纠正错误并成功完成该过程被指定执行的任何功能,或者,如果您想在将错误返回给客户机之前对其进行处理(如修改消息,或将其存储在错误日志表中,或向某人发送电子邮件等)(尽管我更喜欢从DAL层执行这些操作)

但是,从技术上讲,catch子句并没有返回错误。它只是返回一个带有错误信息的resultset。这是非常不同的,因为它不会在客户端代码中导致异常。这就是为什么您的结论是正确的,您应该让原始错误直接传播回客户端代码

正如您编写的一样,不会向客户端返回任何错误。与普通代码一样,如果您不处理(纠正)catch子句中的错误,则应始终重新显示它(在sql中,这意味着Raiserror函数)在catch子句中。您上面所做的通常是不好的,客户机代码可能有,也可能没有适当处理的能力 与预期完全不同的记录集(带有错误信息的记录集)。某些调用(如Inserts updates或deletes)可能根本不期望或查找返回的记录集…相反,如果您希望或需要在将其返回到cl之前对过程中的错误执行某些操作,请执行此操作