2007.01.26

SQLServer 2005 の try-catch について

この前内から SQLServer2005 を使っているが、どうも合点のいかないところがある。
例えば下記のようなコード

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[hogeProc]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[hogeProc] Go


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段階深くしておけということでしょうか???

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ichikawa