Visual Basic .NETでは、アプリケーションで発生した特定のエラーを明示的に示すために独自の例外タイプを作成できます。これを行うには、新しいクラスをSystem.Exception(またはそのサブクラス)の派生クラスとして定義し、必要に応じて追加の情報を渡すための新しいプロパティを追加します。
カスタム例外は、特定のビジネスシナリオに対して特異な処理が必要な場合、コードをより読みやすく、保守しやすくします。
例:
Public Class InvalidUserNameException Inherits ApplicationException Public Sub New(message As String) MyBase.New(message) End Sub End Class ' 使用例: Sub ValidateUserName(userName As String) If userName = "" Then Throw New InvalidUserNameException("ユーザー名は空にできません") End If End Sub
質問: 「Visual BasicでThrow "エラー"を使って単に文字列をスローすることはできますか?そして、Try...Catchはこれを処理しますか?」
回答: いいえ、それはできません。Throw演算子はException型のオブジェクトを要求します。文字列をスローしようとすると(Throw "err")、コンパイルエラーになります。常にExceptionまたはそのサブクラスの新しいインスタンスを作成する必要があります。
無効なコードの例:
' これはエラーを引き起こします! Throw "エラー!"
正しいコードの例:
Throw New Exception("エラー!")
ストーリー:
大規模なプロジェクトで、ある開発者が
Throw "不正なデータ!"を使用して例外をスローしていました。これが原因で本番環境でコンパイルエラーが発生したため、コードが静的検査を通過できませんでした。例外の正しい処理が欠如していたため、リリースは1週間遅れました — コード全体で文字列を使用したthrowの全てのケースを探し出し、書き直す必要がありました。
ストーリー:
チームは、
InnerExceptionパラメータを持つコンストラクタを追加せずにカスタム例外を作成しました。複雑なエラーの診断中に元の例外を「ネスト」できなかったため、スタックトレースが失われました。その結果、障害の根本原因を見つけるのが難しくなりました。
ストーリー:
メディアアプリケーションでカスタム例外が頻繁に不適切に使用されていました(例えば、毎回不正確なデータが入力されたときなど)。その結果、システムのパフォーマンスが低下しました — 例外の生成はオペレーショナルコストがかかります。レビューの後、そのような例外の一部は通常の条件チェックに置き換えられました。