この前内から SQLServer2005 を使っているが、どうも合点のいかないところがある。
例えば下記のようなコード
CREATE PROCEDURE hogeProc;1 As
Go
CREATE PROCEDURE hogeProc;2
As
begin try
begin try
-- print 1/0 -- ①ゼロ除算(hoge2x Error でcatch)
-- select * from ukeke -- ②存在しないオブジェクト(hoge1 Error でcatch)
print 'hoge2 OK' + '(' + convert(varchar,isnull(error_number(), 0)) + ')'
end try
begin catch
print 'hoge2x Error'
print convert(varchar, error_number())+ ':' + error_message()
end catch
end try
begin catch
print 'hoge2 Error'
print convert(varchar, error_number())+ ':' + error_message()
end catch
Go
Alter PROCEDURE hogeProc;1
As
begin try
-- print 1/0 -- ③ゼロ除算(hoge1 Error でcatch)
-- select * from ukeke -- ④存在しないオブジェクト(SQL Server で Error表示)
exec hogeProc;2
print 'hoge1 OK' + '(' + convert(varchar,isnull(error_number(), 0)) + ')'
end try
begin catch
print 'hoge1 Error'
print convert(varchar, error_number())+ ':' + error_message()
end catch
Go
①③ のゼロ除算は期待通り catchされる。
しかし②はなぜ外側のプロシージャで catchされるのだ?
④に至っては、catchを掛けている意味がなくなる。
(severity の違いだと思われるが…?)
致命的でもエラーを出したくない場合は、
常にプロシージャの呼び出しを1段階深くしておけということでしょうか???