• ベストアンサー

TRY CATCHでシステムエラーを検知できない

TRY CATCHをネストさせた状態で、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか? BEGIN TRY   ★   BEGIN TRY     ▲   END TRY   BEGIN CATCH   END CATCH CATCH END CATCH としているときに、 ★の位置だとテーブルのドロップはCATCH できるのですが ▲の位置だとテーブルのドロップはCATCH できないようですが、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

関係ないかもしれませんが、 BEGIN TRY   ★   BEGIN TRY     ▲   END TRY   BEGIN CATCH   END CATCH CATCH ↑ここにBEGINが必要では? END CATCH というのは置いておいて、 本当に、 ★の位置だとテーブルのドロップはCATCH できるのですが ▲の位置だとテーブルのドロップはCATCH できないようですが、 となっているのでしょうか? BEGIN TRY   ★   BEGIN TRY     ▲   END TRY   BEGIN CATCH     ※1   END CATCH BEGIN CATCH ※2 END CATCH となっていたら、▲でテーブルがdropされていてエラーになったら、※2が実行されていると 思われるのですが。 ★と▲両方に別のテーブルを使ったselect文を入れてみてそれぞれのテーブルがdropされた状態で 試してみられては、と思います。 理由 ▲で使用しているテーブルがないときに、   BEGIN TRY     ▲   END TRY   BEGIN CATCH     ※1   END CATCH がコンパイルエラーになるので、※2のほうのcatchが処理される。 と思いますが。 参考; http://msdn.microsoft.com/ja-jp/library/ms175976.aspx の ---引用--- TRY ブロック内の下位の実行レベル (たとえば、sp_executesql またはユーザー定義のストアド プロシージャを実行しているとき) でのコンパイル中またはステートメントレベルの再コンパイル中にエラーが発生した場合、そのエラーは TRY...CATCH 構造よりも下位のレベルで発生し、関連する CATCH ブロックによって処理されます。 次の例は、SELECT ステートメントによって生成されたオブジェクト名解決エラーが TRY…CATCH 構造でキャッチされず、同じ SELECT ステートメントをストアド プロシージャ内で実行した場合には CATCH ブロックでキャッチされることを示しています。 (以下例文が載っていますが省略) ---引用ここまで--- ・・・マニュアルベースで実際には試していないですが。

souken_200
質問者

お礼

ありがとうございます もう一度実行してみます!

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

例外で判断させるのは難しいのでは。 テーブルの存在確認かDDLトリガーを使用してみるとか。

souken_200
質問者

お礼

テーブル存在確認、DDLトリガー、調べてみます! ありがとうございます!

関連するQ&A

  • SQLの重大度エラーがうまく検知できません

    お世話になっています。 WindowsXP(SP3)、SQL2005(SP3)、VB6.0(SP6)で開発を行っています。 今、データベースにINSERTするトリガを作成していますが、TRY-CATCHがうまくいきません。今現在のコードは、次のようになっています。 ---コードはじめ DECLARE @ERR VARCHAR (2000) DECLARE @STR VARCHAR (2000) DECLARE @res int begin try EXEC @res = sp_executesql N'INSERT INTO TEST (SEIYMD,ZENYYYYMM,STYMD,SIMEBI) VALUES (null,0,0,0)'     if @res<>0 begin     raiserror('テストエラー1',11,1) end end try BEGIN CATCH     raiserror('テストエラー2',11,1) END CATCH ---コード終わり ここで、TEST(SEIYMD,ZENYYYYMM,STYMD,SIMEBI)は、すべてnumeric型で、null型を認めていません。 調べたところ、これでCATCHステートメントへ飛ぶようになると思うのですが、うまくいきません。 この原因、対策等を知っていましたら、ご教授ください。お願いいたします。

  • TRANSACT-SQLでのシステムエラーの検知

    TRANSACT-SQLで下記のような処理を記述したとき、 (1)~(3)で起きたシステムエラーの検知はCATCHで共通的に行えますか? TRY  SELECT処理  ↓  エラー発生(1)  ↓  INSERT処理  ↓  エラー発生(2)  ↓  UPDATE処理  ↓  エラー発生(3) CATCH  GOTO 異常終了処理 END COMMIT :異常終了定義 ログ出力(エラーメッセージ) ロールバック ※エラー処理は、テーブルがDROPされていた、ディスクが破損したなどの通常は発生しないエラーが起きた場合を想定しています。 ※エラーメッセージはステートメントが最終の処理の結果を持ってくれていて、その取得方法があると思っています。 もし実現できなかったり、実現出来たとしても問題があるようであればご指摘頂きたく存じます。

  • Try, Catch についての質問

    すみません!!VB超初心者です。 PriceとCostのテキストボックスにマイナスやアルファベットを記入して計算ボタンを押した場合、Errorを示すメッセージボックスを出したいのです。 ところが、このプログラムだとちゃんと正の数字を入れた場合でもエラーのメッセージボックスがでてしまいます・・・。これはなぜなのでしょうか?よろしくお願いします! Dim priceDecimal, costDecimal, answerDecimal As Decimal Try priceDecimal = Decimal.Parse(txtprice.Text) costDecimal = Decimal.Parse(txtcost.Text) answerDecimal = Decimal.Parse(lblcomission.Text) Try txtprice.Text = priceDecimal < 0 txtcost.Text = costDecimal < 0 Catch priceException As FormatException MessageBox.Show("You have entered Invalid Data.", "Error", MessageBoxIcon.Exclamation) End Try Catch costException As FormatException MessageBox.Show("You have entered Invalid Data", "Error",MessageBoxButtons.OK, (MessageBoxIcon.Exclamation) End Try answerDecimal = Commision_rate_Decimal * (priceDecimal - costDecimal) lblcomission.Text = answerDecimal.ToString("C") End Sub

  • Transact-SQLのBULK INSERTでエラーをキャッチしたい

    ・環境 WindowsXP Pro SQL Server2005 はじめまして。 Transact-SQLのBULK INSERTで、エラー(ファイルが存在しない等)が発生した場合に、専用の処理を行いたいと思っています。 ※BULK INSERTでエラーが発生したら、リターンコード100を返す等の処理を行いたいと思ってます 私の方で試したのは、BULK INSERTをBEGIN TRYでネストしエラーキャッチを行おうと思いましたがキャッチできず困っております。 以下、質問させてください。  ・BULK INSERTのエラーはエラーキャッチできないのか?できる場合その方法は?  ・エラーキャッチできない場合、他の方法でBULK INSERTエラー時の処理を行う方法はあるのか? お手数ですが、よろしくお願いします。

  • rubyのevalのエラーを検知したい

    rubyでevalを実行した時、その文が、構文的に正しくない場合、実行時にエラーになりますが、これを、検知する方法はあるでしょうか。 begin eval("実行対象の文(構文エラーの可能性有り)") resucue ここが実行されることを期待したが、ここに制御が移りませんでした。 end

  • delphi try文の使い方

    下記コードのようにエラーを回避したいのですが、try文が機能せずエラーになります。 procedure TForm1.Button1Click(Sender: TObject); var p:integer; begin edit1.text:='abc'; try p:=strtoint(edit1.Text); except p:=-1; end; label1.Caption:=inttostr(p); end; try文の使い方がわかりません。

  • try...catchステートメントについて

    お世話になっています。 WindowsXP(SP3)、SQL2005(SP3)、VB6.0(SP6)で開発を行っております。 SQL2005で、トリガーを作成しています。実行時エラー検知のため、TRY...CATCHステートメントを利用して、エラーを検知するように作成していますが、エラーが検知できません(実行時エラー)。 TRY...CATCH構文では、エラーレベル10以下のエラーは補足できませんが、そのエラーを表示させる方法はあるのでしょうか?また、10以下のエラーレベルを任意に変えることはできるのでしょうか? 未熟者ですが、ご教授願います。

  • ソースの全てにtryを使うことについて

    実行時エラーでエラーのソース位置とエラー原因が分からない場合があります。 コンストラクタとデストラクタとメソッドは、最初から最後までをtryでくくって、} catch (Exception e) { でe.toString()をログファイルに書き出すようにしようと考えていますが、得策でしょうか?

    • ベストアンサー
    • Java
  • 例外ってIf文の中に入れますか?If文の外でTry...Catchしますか??

    例外ってIf文の中に入れますか?If文の外でTry...Catchしますか?? Sub Cal(By Val Data As String)  If ( Flag = "hoge") Then  Total = js.Eval(Work)  End If End Sub それと、”エラーコードをテキストの説明に変換する”FormatMessage関数を使おうと思っています。 「例外処理 = FormatMessage関数」という図式は古いですか?いまはもっと違う方法ですか?

  • try{}catchでエラー???

    いつもお世話になり誠にありがとうございます。 標記の件。 エラーメッセージが Parse error: syntax error, unexpected token "=" in C:\xampp\htdocs\blog_create.php on line 32 stmt = $dbh->prepare($sql); の=が予期しないトークンと書かれています。 どう調べればいいのでしょうか? アドバイスをください。 宜しくお願い申し上げます。     記 <?php require_once('dbc.php'); $blogs = $_POST; if (empty($blogs['title'])) { exit('タイトルを入力してください。'); } if (mb_strlen($blogs['title'])>191) { exit('タイトルは191文字以下にしてください。'); } if (empty($blogs['content'])) { exit('本文を入力してください。'); } if (empty($blogs['category'])) { exit('カテゴリーは必須です。'); } if (empty($blogs['publish_status'])) { exit('公開ステータスは必須です。'); } $sql = 'INSERT INTO blog(title,content,category,publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = dbConnect(); try { stmt = $dbh->prepare($sql); stmt->bindValue(':title',$blogs['title'],PDO::PARAM_STR); stmt->bindValue(':content',$blogs['content'],PDO::PARAM_STR); stmt->bindValue(':category',$blogs['category'],PDO::PARAM_INT); stmt->bindValue(':publish_status',$blogs['publish_status'],PDO::PARAM_INT); stmt->execute(); } catch(PDOException $e){ exit($e); } ?>

    • ベストアンサー
    • MySQL