C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■103698 / )  Re[1]: エラー処理について
□投稿者/ 魔界の仮面弁士 (3848回)-(2025/05/28(Wed) 10:00:14)
2025/05/28(Wed) 10:05:45 編集(投稿者)

(書いているうちに No103696, No103697 が投稿されていたようで…)

No103695 (マクベス さん) に返信
> プログラム中にエラーが発生するとエラー処理を行うために
> On Error GoTo ***
> を追加します。

投稿時の分類が、
> 分類:[.NET 全般]
になっていますが、これは本当でしょうか?
[VB6 以前] や [Microsoft Office 全般] では無いのでしょうか?

VB6 や VBA であれば、On Error GoTo がしばしば利用されますが、
VB.NET においては本来、On Error GoTo は非推奨の構文です。


元質問のコードを見ると、
「MsgBox ("エラー")」 ← VBA 的な構文
ではなく、
「MsgBox("エラー")」 ← VB.NET 的な構文
と書かれていることから、VBA でははなく本当に VB.NET である可能性も捨てきれないですね。

とはいえ、「private function func1(**) as Boolean」という記述からすると、
これは単に掲示板に直書きしただけで、実際のコードと一致するものでは無いのでしょうけれども。


> この後デバッグ中にエラーが出ると
> エラーの行がわからないので
まず、VB.NET であるなら、On Error は使わず、Try - Catch による構造化例外処理を行うべきです。
これならば、例外時の Exception の StackTrace からエラー発生個所を調べることができます。

どうしても On Error を用いる場合、ソースに行番号を付与しておくと、
Erl 関数から「最後に通過した行番号」を得られます。(VBA でも VB.NET でも)
行番号が無い場合は 0 を返します。調査目的の機能なので、普段から使うようなものでは無いですが。

とはいえ On Error GoTo でジャンプしないということは、そもそものエラー発生個所が想定と違っていたか、
あるいは実行プログラムとソースコードのバージョン乖離という可能性もあるかと思います。


第三者が事象を再現可能な、最低限の短い実験用ソースコードを用意することはできますか?
頂いた情報だけでは、現在の状況が今一つ掴み切れずにいます。


> On Error GoTo 0
> をエラー発生している箇所の前につけたのですが
> エラーが発生している行で止まりません。
これは、ステップ実行した場合も同様なのでしょうか?

もしも VBA であるのなら、[ツール]-[オプション]設定の [全般]タブにて、
エラートラップモードを変更してみてください。
 ・エラー発生時に中断
 ・クラス モジュールで中断
 ・エラー処理対象外のエラーで中断


> private function func1(**) as Boolean
> ' これを追加してもエラー行で止まらず
> ' [エラー]のメッセージボックスが表示される
> '   ↓
『[エラー]のメッセージボックス』を表示しているのは、
func1 の方では無く、Sub の方なのですよね?

エラー発生個所で止める以前の問題として、

call func1(**)
ERROR:
 MsgBox("エラー")

ではなく、

call func1(**)
Exit Sub
ERROR:
 MsgBox("エラー")

にしておくべきなのでは。
返信 編集キー/


管理者用

- Child Tree -