在 If 语句中包装 try/catch 块
Wrapping a try/catch block in an If statement
在 T-SQL 中,以下是正确的:
- Try 和 Catch 块被视为单独的语句
- 不成功的 If 语句导致跳过后续语句
鉴于这些事实,以下代码会导致任何异常行为吗?
IF EXISTS (
SELECT someValue FROM someTable WHERE someValue = 1
)
BEGIN TRY
-- do something
END TRY
BEGIN CATCH
PRINT @@ERROR
END CATCH
如果 IF 语句的计算结果为假,是否会执行 PRINT @@ERROR 行?
我的直觉是,如果控制从未到达 Try 块,则 Catch 块中的代码将不会执行,但我找不到任何文档来解决这个特定问题。
我可以通过将整个 Try/Catch 块包装在 BEGIN 语句中来跳过整个问题,但我想尽可能避免这种情况(只是为了美观)。
Will the PRINT @@ERROR line execute if the IF statement evaluates to
false?
简单回答否。你可以自己试试看。只有当 IF ..
块的计算结果为 TRUE
时,它才会这样做。请参阅下面的示例代码
alter procedure testsp
as
begin
declare @var int;
IF EXISTS (
SELECT Name FROM student WHERE Marks < 90
)
BEGIN TRY
set @var = 20/0;
END TRY
BEGIN CATCH
PRINT @@ERROR
END CATCH
end
在 T-SQL 中,以下是正确的:
- Try 和 Catch 块被视为单独的语句
- 不成功的 If 语句导致跳过后续语句
鉴于这些事实,以下代码会导致任何异常行为吗?
IF EXISTS (
SELECT someValue FROM someTable WHERE someValue = 1
)
BEGIN TRY
-- do something
END TRY
BEGIN CATCH
PRINT @@ERROR
END CATCH
如果 IF 语句的计算结果为假,是否会执行 PRINT @@ERROR 行? 我的直觉是,如果控制从未到达 Try 块,则 Catch 块中的代码将不会执行,但我找不到任何文档来解决这个特定问题。
我可以通过将整个 Try/Catch 块包装在 BEGIN 语句中来跳过整个问题,但我想尽可能避免这种情况(只是为了美观)。
Will the PRINT @@ERROR line execute if the IF statement evaluates to false?
简单回答否。你可以自己试试看。只有当 IF ..
块的计算结果为 TRUE
时,它才会这样做。请参阅下面的示例代码
alter procedure testsp
as
begin
declare @var int;
IF EXISTS (
SELECT Name FROM student WHERE Marks < 90
)
BEGIN TRY
set @var = 20/0;
END TRY
BEGIN CATCH
PRINT @@ERROR
END CATCH
end