下面是我TRY/CATCH
在带有错误处理的存储过程中的逻辑片段(我没有包括所有DECLARE
语句)。这是在存储过程中运行的,但是我只是通过 SSMS 在会话中测试它(这会影响行为吗?)。我确实偶然发现了这个线程,但是我是否必须竭尽全力才能简单地捕获错误?
BEGIN TRY
DECLARE @sql varchar(1000);
SET @sql = 'select 1/0';
EXEC(@sql);
-- On Error the remaining TRY/CATCH below is compeltely ignored I discovered.
DECLARE @error int;
SET @error = @@error;
IF @error > 0
BEGIN
SET @raisemessage = 'SQL Backup Error: ' + cast(@rc as varchar(10));
RAISERROR (@raisemessage, 16,1);
END
END TRY
BEGIN CATCH
SET @errormessage = ERROR_MESSAGE();
IF @errormessage is null
SET @errormessage = ''
SET @errorstring = @errorstring + 'Database: ' + @name + ' Error: ' + @errormessage + char(10) + char(10);
END CATCH
谁能解释这个 TRY/CATCH 块的缺点?这在 T-SQL 中不起作用吗?
这实际上比我想象的要简单得多。假设上面使用的所有变量都在其他地方声明,关于为什么 catch 不起作用的简单答案是它正在工作,但它在内部存在语法错误,导致返回值为 NULL。
考虑这一行:
除非你像这样声明@errorstring:
或分配
@errorstring
为某个值,该变量当前设置为 NULL。而且,默认情况下,将任何内容连接到 NULL 会返回... NULL。将此处的代码更改为
将变量设置为正确的值。