由于X_TEST列不存在,我预计会出现错误。 但错误没有被异常块捕获。
BEGIN TRY
SELECT X_TEST FROM ACCOUNTS
END TRY
BEGIN CATCH
PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
为什么?是因为错误的严重性?
答案 0 :(得分:3)
不,TRY只能在自己的范围内处理某些类型的错误。现在,您说您有一个看起来像这样的存储过程(在non_existent_column
被删除之后):
CREATE PROCEDURE dbo.blat
AS
BEGIN
BEGIN TRY
SELECT non_existent_column FROM dbo.table_that_exists;
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
END CATCH
END
GO
如果你只是这样做......
EXEC dbo.blat;
...您将受到编译错误的困扰,因为该TRY范围内的语句无法解析:
Msg 207, Level 16, State 1, Procedure fooblat, Line 5
Invalid column name 'non_existent_column'.
但是,您可以在外部范围捕获此错误(过程是否具有TRY/CATCH
):
BEGIN TRY
EXEC dbo.fooblat;
END TRY
BEGIN CATCH
PRINT 'There was an error:';
PRINT ERROR_MESSAGE();
END CATCH
结果(注意这不是例外,文字不再是红色):
There was an error:
Invalid column name 'non_existent_column'.
你也可以通过动态SQL来避免这种情况,但似乎你已经把它击落了,所以这是我能想到的下一个最好的建议 - 在外部范围捕获错误。
答案 1 :(得分:2)
使用不存在的列是语法错误。您的批次甚至从未开始执行。
考虑以下代码:
BEGIN TRY
sdgedtju§$%&/()=
END TRY
BEGIN CATCH
PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH
你不会指望它甚至开始吧?它不编译。使用不存在的列是相同的
答案 2 :(得分:2)
此代码会为您提供您期望看到的行为......
BEGIN TRY
exec('SELECT X_TEST FROM ACCOUNTS')
END TRY
BEGIN CATCH
PRINT 'There was an error! ' + ERROR_MESSAGE()
END CATCH