[Err.Getexception]について

このQ&Aのポイント
  • この質問では、ソースコードの例外処理部分にある「If TypeOf Err.Getexception Is Oracle.DataAccess.Client.OracleException Then」という記述についての理解を求めています。
  • また、エラーを表わす例外とは何か、具体的には「Err.Getexception」とはどのような要素なのかについても知りたいとしています。
  • さらに、「Oracle.DataAccess.Client.OracleException」という言葉の意味や役割についても説明を求めています。
回答を見る
  • ベストアンサー

[Err.Getexception] について

とあるソースコードを読んでいるのですが、 その中の例外処理部分に If TypeOf Err.Getexception Is Oracle.DataAccess.Client.OracleException Then ~~~ End If という記述があるのですが、このコードの意味が分かりません。 このコードの意味することをどなたか教えていただけませんでしょうか。 すごく気になっています。 コードの意味を説明して下さる時には、下記(1)、(2)についても説明していただけると助かります。 (1)そもそもErr.Getexceptionが何を意味しているのか。  発生したエラーを表わす例外って何のことなんでしょうか。  (msdnのリファレンスを見ましたが全然わかりませんでした。) ↓msdn↓ http://msdn.microsoft.com/ja-jp/library/yk5ztsez(VS.80).aspx (2)Oracle.DataAccess.Client.OracleExceptionの意味 当方、プログラミングをほとんど素人同然です。 どなたかよろしくお願い致します。

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

  • ベストアンサー
回答No.3

#1 Wizard_Zeroです。 Exception(例外)とは、プログラムの実行を中断した例外情報を格納するオブジェクトです。プログラムの実行を中断する原因はさまざまであり、その原因に合わせて、IOExceptionやNullReferenceExceptionといったオブジェクトが格納されます。 補足で挙げられた「0での除算」の場合は、OverflowExceptionオブジェクトが格納されます。 一般的に「~Exception」という名前のオブジェクトは、Exceptionオブジェクトを継承したものなので、Exception型の変数に代入することができます。Err.GetExceptionの戻り値がSystem.Exceptionであるのはこのためです。 しかし、このままではプログラムの実行が中断されたことは分かりますが、その原因が何なのかまでは分からないため、TypeOf~Isステートメントを使って、例外を発生させた原因を明確にしているのです。 [ エラーの原因が明確にならない例 ] If Err.GetException IsNot Nothing Then '何らかのエラーが発生した。 End If [ エラーの原因が明確になる例 ] If TypeOf Err.GetException Is IO.IOException Then ' I/Oエラーが発生 ElseIf TypeOf Err.GetException Is OverflowException Then ' 0で除算 ElseIf Err.GetException IsNot Nothing Then ' 特定不可能 End If 余談ですが、Errオブジェクトを使った例外処理は、VB6.0時代のコードと互換性を保たせるために残されている(と思う)ので、.NETでコーディングするのであれば、Try~Catchを使って下記のように記述します。 ※Err.GetExceptionに関する記事が少ないのは、このあたりが原因かと。。。 Try '処理 Catch ex As IO.IOException ' I/Oエラー Catch ex As OverflowException ' 0で除算 Catch ex As Exception ' 特定不可能 End Try

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>こういうのはGoogleででも「Oracle.DataAccess.Client.OracleException」 「VB.NET Catch Try」 でWEB照会すれば様々な記事が何万と出てきます。その中をのぞくのが良い。 Catch Try http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard12.htmほか多数。 ーー 「Oracle.DataAccess.Client.OracleException」 オラクルはオラクル社のデータベースを管理するソフトで、最も使われているデーベースソフトの1つです。だからMS社といえどもVB.Netでも、VB.NETでそれを使っているユーザー(世界的に数が多い)の事を考慮せざるを得ないのだと思います。 それで製品名らしいものが出てくるのだと思います。 http://otndnld.oracle.co.jp/beginner/odpnet/1_1/index.html の図参照。 Exceptionとは俗にはエラーが起こった、という場合の処理を書くところで、システム側で、予期せぬこと(例外)が起こった場合にプログラム実行権をここに移してもらい、ユーザーが処理コードを書く(適当な処理をさせる) Jave言語で先行し、VB.NETに現れた。

bebestplay
質問者

お礼

ご丁寧に歴史まで説明いただきありがとうございます。 最低限googleで検索することはしたのですが、 説明に使われている用語が難しくて全くイメージが 湧かなかったので投稿させていただきました。 徐々に自力で読解できる力を身につけていかなければいけませんね。

回答No.1

If ☆ Then ★ End If ☆(条件式)がTrue(真)であれば★が実行されます。 今回の場合、☆は「TypeOf Err.Getexception Is Oracle.DataAccess.Client.OracleException」です。 TypeOf ○ Is ● ○(検証するオブジェクト)のデータ型が、●(データ型)であればTrue(真)となり、●以外であればFalse(偽)となります。 Err.GetException エラーを発生させた例外(Exceptionオブジェクト)を取得します。 .NETでは、何らかの理由でプログラムの実行が中断されたことを示す情報を「例外(Exception)」と呼んでいます。一般に.NETでは「Try~Catch」ステートメントを使って例外処理を行いますが、VB6.0以前と互換性を保つために「Errオブジェクト」が用意されています。このErrオブジェクトから.NETの例外情報を取り出すメソッドが「Err.GetException」です。 Oracle.DataAccess.Client.OracleException (名前空間からの推測ですが)Oracleデータベースへクライアントとしてアクセスする場合に、何らかのエラーが発生すると呼び出される例外ではないかと思います。 まとめると、 Err.GetExceptionのデータ型がOracle.DataAccess.Client.OracleExceptionである場合にIf~End Ifの間に記述した処理を行う。 となります。

bebestplay
質問者

お礼

ありがとうございました。

bebestplay
質問者

補足

丁寧にご説明していただきありがとうございます。 ・If~End If ・TypeOf ・Oracle.DataAccess.Client.OracleException についてはよく分かりました。 ご説明をいだたいて追加で疑問が湧いてきたのですが、 Err.GetException は エラーを発生させた例外を取得するとのことですが、 では、例外(Exceptionオブジェクト)とは いったいどんなものなんでしょうか? 例えば「0による除算」はランタイムエラーだと思いますが、 (間違っていたらすいません) これが起きた時、Err.exceptionには何が入っているんでしょうか?

関連するQ&A

  • VBからOracleに接続できない

    Visual BasicからOracleに接続すると、下記のエラーになり接続できません。 型 'System.TypeInitializationException' の初回例外が DBConnectSample.exe で発生しました 追加情報:'Oracle.DataAccess.Client.OracleConnection' のタイプ初期化子が例外をスローしました。 接続部分のソースコードは以下になります。(★がエラーになるコード) -----ここから----- Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types 'Connectionオブジェクトの生成 Dim cnn As New OracleConnection ★ 'Oracleへのコネクションの確立 cnn.ConnectionString = "User Id=<user>; Password=<pass>; Data Source=ora11g" 'Oracleへの接続 cnn.Open() -----ここまで----- あと、他にやった事といえば、これぐらいです。 ・[参照の追加]でOracle.DataAccess 4.112.4.0を追加 ・[ビルド]はOSに合わせてx64を選択 色々ググってみても何が足りないのか、何が間違っているのか見当がつきません。

  • Oracle Developer Tools for Visual Studio .NET with ODAC10.2.0.2.21のインストールエラー

    Oracle Developer Tools for Visual Studio .NET with ODAC10.2.0.2.21を OTNのダウンロードサイトより、ダウンロードし、インストールを行ったところ、 約96%終了時点で、エラーが発生してしまい、正常にインストールが行えないのです。 インストールは、Windows2003 Server R2に対し行っています。 インストールログの内容を見たところ、以下のようになっていました。 ちなみに、gacutil.exeは、対象のマシンには見つかりませんでした。 ------------------------------------------------------------------------------------- 【ログの抜粋】 情報: 08/11/21 21:44:33 JST: インストールを開始します。インストール・フェーズ2コンポーネントOracle Data Provider for .NET 2.0 情報: 呼出し中:アクション:SpawnActions10.1.0.2.0 Spawn installcommand = C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\\bin\gacutil.exe /I C:\oracle\product\10.2.0\client_1\odp.net\bin\2.x\Oracle.DataAccess.dll deinstallcommand = C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\\bin\gacutil.exe /u Oracle.DataAccess,Version=2.102.2.20 WaitForCompletion = true 情報: Exception occured during spawning :CreateProcess: C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\\bin\gacutil.exe /I C:\oracle\product\10.2.0\client_1\odp.net\bin\2.x\Oracle.DataAccess.dll error=2 情報: アクションからスローされた例外: Spawn 例外名: RuntimeException 例外文字列: 実行時にエラーが発生しました。 例外の重大度: 0 情報: 例外処理はユーザーにオプションの選択を求めるように設定されています。 RETRY IGNORE ------------------------------------------------------------------------------------- 2週間ほど前に、別のサーバーに対し、インストールしたときには、 正常にインストールされたことがあり、その時のログは、以下の通りでした。 ------------------------------------------------------------------------------------- 【ログの抜粋】 情報: 08/11/06 15:46:48 JST: インストールを開始します。インストール・フェーズ2コンポーネントOracle Data Provider for .NET 2.0 情報: 呼出し中:アクション:SpawnActions10.1.0.2.0 Spawn installcommand = C:\oracle\product\10.2.0\client_1\bin\ODPReg.exe C:\oracle\product\10.2.0\client_1\odp.net\bin\2.x\Oracle.DataAccess.dll deinstallcommand = C:\oracle\product\10.2.0\client_1\bin\ODPReg.exe C:\oracle\product\10.2.0\client_1\odp.net\bin\2.x\Oracle.DataAccess.dll /u WaitForCompletion = null 情報: -------------------------------------------------------------------------------------  installcomandの実行ファイル違うので、それが原因と思われるのですが、  どうしたら、この違いが出るのかが、さっぱりわからないのです。 どなたか、心当たりのある方がいらっしゃったら、コメントをお願い致します。

  • ODB.netでの接続環境について

    こんにちわ。質問させていただきたいことがあります。 OS:ローカルデバッグ環境 WindowsXP+SP2 (実際はWindowsServer2003 R2) 開発環境:VS2005(VB.net) .net:2.0.50727 Oracle:10g(10.2.0.1.0) 現在、VB.net+ODP.netで開発を進めております。VS2005でデバッグするため WindowsXPにIISをインストールして環境を作成しました。 最初にOracleClient 10.2.0.1.0のみをインストールして製造作業をすすめており 以下のようなコードで記述し、問題なく動作しておりました。 この場合特に「ODP.net」というコンポーネントをインストールした覚えはありません。 --------------------------------------------------------------------------------------- Imports Microsoft.VisualBasic Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types Imports System.Configuration Private cnn As New OracleConnection Private trans As OracleTransaction Dim connectionString As String = "Data Source=xxxx;User ID=xxxx;Password=xxxx" cnn.ConnectionString = connectionString cnn.Open() ------------------------------------------------------------------------------------------ ところが、いろいろなページを参照すると「ODP.net」はインストールが必要とのことだったので、 「ODTwithODAC1020221.exe」というファイルをダウンロードしてインストールしました。 すると参照の追加に「Oracle.DataAccess 2.102.2.20」という行が現れこれを選択すると 「OracleConnection' は、名前空間 'Oracle.DataAccess.Client' では不適切です。 」 というエラーが発生して接続できなくなりました。 教えていただきたいポイントとしては 1.ODP.net接続をする場合は別途インストールする必要があるのでしょうか? それともOracleClientに含まれているのでしょうか? またもし別途インストールする必要があるなら、最初に接続に成功していた場合 はODP.netでは接続していなかったということになるのでしょうか? 2.「ODTwithODAC1020221.exe」というファイルはODACとしてまとめられていますが これがインストールされている場合は逆にOracleClientは必要ないのでししょうか(混在可?)? 3.この発生しているエラーは何を意味しているのでしょうか? ちょっと乱文になりましてすみません。今回オラクルは初めてでいろんなコンポーネント があり、混乱しているようです。 ご教示いただけるかたいらっしゃいましたらお忙しいところすみませんがよろしくお願いいたします。

  • managed(push, off) の意味

    C#を勉強し始め、アンマネージド(ネイティブ・コード)のコードを書く必要があり C++での記述を調べています。 マネージ・コードとネイティブ・コードの混在ということは 「#pragma managed」「#pragma unmanaged」で使い分ける事は理解できたのですが MSDNにある #pragma managed([push,] on | off) #pragma managed(pop) の意味がよくわかりませんでした。 http://msdn.microsoft.com/ja-jp/library/0adb9zxe.aspx こちらに関して説明が乗っているHP、もしくはその説明を教えていただけないでしょうか。 よろしくお願いします。

  • MSDNでVisualBasicコードを印刷には?

    WindowsXP, InternetExplore8でMicrosoftのMSDNのあるページの画面を印刷したいのですが、画面上には、VisualBasic、C#、VisualC++などいろいろなプログラムの言語のサンプルコードが表示されているのですが、[ファイル]メニューの[印刷プレビュー]で確認するとC#のサンプルコードだけしか表示されません。実際に[ファイル]メニューの[印刷]で印刷してみてもC#のサンプルコードだけしか印刷されません。 ここで、「C#のサンプルコードだけ」とは、全体の説明文と、C#のサンプルコードだけあり、他の言語のサンプルコードがないという意味です。 例えば、 http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.varenum.aspx のMSDNのページには、「VarEnum 列挙体」の説明が記載されていますが、VisualBasicのサンプルコード(説明文を含む)を印刷することはできるのでしょうか。 このページ上にある「言語フィルタ」や「印刷用ページ」なども試してみましたができませんでした。 よろしくお願いします。

  • オラクルデータベースへの更新方法

    Visual Basic 2008 を使用しています。(初心者です) ODP.NETにてデータセットし、 オラクルのテーブルを読み込む事は可能なのですが、 データセットに更新して、 オラクルのテーブルレコードを更新する方法がわかりません。 【】内にソースを記載して頂ければ幸いです。 ご伝授願いたく宜しくお願い致します。 例) オラクルテーブル名= 社員マスター フィールド= 社員番号、社員名 Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types Dim cnn As New OracleConnection Dim cmd As New OracleCommand Dim dsList As New DataSet Dim adp As New OracleDataAdapter(cmd) cnn.ConnectionString = "user id=ITS;password=ITS;data source=ITS" cmd.Connection = cnn '社員番号 777 がオラクルテーブルにあるか cmd.CommandText = "Select * from 社員マスター WHERE 社員番号 = 777 " adp.Fill(dsList, "EMPMSTR") 'DataSetの件数が0なら If dsList.Tables("EMPMSTR").Rows.Count = 0 Then 【ここに記載すると思いますが、 社員番号=777 社員名=太郎 をデータセットとオラクルテーブルに追加するソースをお願い致します。】 else '社員番号 777 がある場合。 【ここに記載すると思いますが、 社員番号=777 の 社員名を 太郎 に変更し、データセットとオラクルテーブルを更新するソースをお願い致します。】 end if

  • エラー処理

    エラー処理について質問です。 私はどうもVBのエラー処理が頭についているせいか、Javaの例外処理等が面倒に見えてならないんです。 例えば下記はVBのエラー処理なんですが、引数を得て計算して値を返すというものなのですが、引数自体が間違えてたら意味ないということでチェックします。 色んなチェックをして1つでも間違えてたらVVV_ERRORに飛びます。 下記のように「桁数チェック」とか「数値か?」とか調べる場合、Javaだとどのようにして書いたらいいのでしょう? Javaならtry文に全部入れてしまえばいいのでしょうが… .....例 try { x = 10 / 5; y = 20 / 0; //エラー } catch ( ArithmeticException ex ) { System.out.println (" 0で割ることはできません"); .....略 要は下記VBのようにモジュールごとに独自のエラーコードが存在する場合、どうエラー処理を書いたらいいのかということです。 皆さんならどうしますか?よろしければご意見等お願い致します。 //////////////////////////////////////////////////////////////// public Function VVV(YYYYMMDD As String , Kotae As String) As String ...... vvv_err = "" On Error GoTo VVV_ERROR '***************引数チェック '8桁か? If Len(YYYYMMDD) <> 8 Then vvv_err = "8桁ではありません" GoTo VVV_ERROR End If '数値か? If IsNumeric(YYYYMMDD) = False Then vvv_err = "数値ではありません" GoTo VVV_ERROR End If .....略(同じようなIf文の引数チェックがたくさんあります) '***************ERROR処理 VVV_ERROR: vvv_err = vvv_err & err.Description & err.Number .....略

    • ベストアンサー
    • Java
  • SOAP::Lite axis 例外処理

    お世話になります。 perlクライアントから、SOAP::Liteモジュールを使い、 axisに登録されたjavaサーブレットクラスを呼び出しています。 (例) $s = SOAP::Lite->service( 'http://xxx.wsdl' ); #サービス名 $s->test(); #javaサーブレットクラス呼び出し javaサーブレットクラスが例外(Exception)で終了した場合、 perlクライアントで例外をキャッチする方法はありますでしょうか? #以下のコードではエラーはキャッチできませんでした。 eval { $s->test(); }; if ($@) { # エラー処理 }; * 通常処理はうまくうごいています。 例外は意図的にExceptionをthrowしています。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関数」という図式は古いですか?いまはもっと違う方法ですか?

  • VBAで参照設定を行いたい GUIDを知るには?

    オフィス2010なのですが、 VBAで参照設定を行いたいのですが GUIDというのはどうやって調べればいいのでしょうか? 例えばエクセルに参照設定したいのですが レジストリエディタを立ち上げて、 HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel のどの部分を見れば、GUIDがわかりますか? http://www.moug.net/tech/acvba/0010004.html を参考にvbaコードを作っていますが、 Public Function SetGUID() On Error GoTo Err_Check: Dim Ref As Reference 'Microsoft Excel 9.0 Objects Library (Excel2000) Const strExcel As String = "{00020813-0000-0000-C000-000000000046}" '参照設定 Set Ref = References.AddFromGuid(strExcel, 1, 3) Func_Exit: Set Ref = Nothing Exit Function Err_Check: If Err.Number = 32813 Then Resume Next Else MsgBox "Error Number : " & Err.Number & vbCrLf & Err.Description GoTo Func_Exit: End If End Function やはりこれだと、参照設定できません。 もちろんオフィスのバージョンが違うからだと思いますが。 あと、AddFromGuidメソッドの引数Major、Minorも、どの値を設定してあげればいいのかわかりません。 ご教授よろしくお願いします。

専門家に質問してみよう