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

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

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

エラー処理について

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■103695 / inTopicNo.1)  エラー処理について
  ▼■
□投稿者/ マクベス (1回)-(2025/05/28(Wed) 08:04:14)

分類:[.NET 全般] 

プログラム中にエラーが発生するとエラー処理を行うために
On Error GoTo ***
を追加します。
この後デバッグ中にエラーが出ると
エラーの行がわからないので
On Error GoTo 0
をエラー発生している箇所の前につけたのですが
エラーが発生している行で止まりません。

仕方がないので毎回
On Error GoTo ***
の行をコメントにしてデバッグをしています。
コメントの付け忘れや外し忘れなどをしたり
とても面倒です。

をエラー発生している箇所の前に
On Error GoTo ***
を元に戻すほうほうはありますか?

private sub 〜
 On Error Goto ERROR
call func1(**)
ERROR:
 MsgBox("エラー")
End Sub

private function func1(**) as Boolean
' これを追加してもエラー行で止まらず
' [エラー]のメッセージボックスが表示される
'   ↓
 On Error Goto 0   

 (ここでエラーが発生している) ←エラーが出ている箇所で止めたい

End Function

引用返信 編集キー/
■103696 / inTopicNo.2)  Re[1]: エラー処理について
▲▼■
□投稿者/ WebSurfer (2953回)-(2025/05/28(Wed) 09:49:11)
■No103695 (マクベス さん) に返信

「.NET 全般」のタグが付いてますが、.NET アプリの話ではなく VBA の話ですか?

.NET アプリの例外処理の話なら try/catch/finally を利用するという話になるは
ずです。

例外の推奨事項
https://learn.microsoft.com/ja-jp/dotnet/standard/exceptions/best-practices-for-exceptions

引用返信 編集キー/
■103697 / inTopicNo.3)  Re[2]: エラー処理について
▲▼■
□投稿者/ マクベス (2回)-(2025/05/28(Wed) 09:56:17)
■No103696 (WebSurfer さん) に返信
>
> 「.NET 全般」のタグが付いてますが、.NET アプリの話ではなく VBA の話ですか?

ごめんなさい。
タグのつけ間違いです。

OS:windows11
version:Excel2016
VBAマクロです。

引用返信 編集キー/
■103698 / inTopicNo.4)  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("エラー")

にしておくべきなのでは。
引用返信 編集キー/
■103699 / inTopicNo.5)  Re[1]: エラー処理について
▲▼■
□投稿者/ WebSurfer (2954回)-(2025/05/28(Wed) 10:03:29)