Visual Basic .NET Language
エラー処理
サーチ…
Try ... Catch ... Finallyステートメント
構造:
Try
'Your program will try to run the code in this block.
'If any exceptions are thrown, the code in the Catch Block will be executed,
'without executing the lines after the one which caused the exception.
Catch ex As System.IO.IOException
'If an exception occurs when processing the Try block, each Catch statement
'is examined in textual order to determine which handles the exception.
'For example, this Catch block handles an IOException.
Catch ex As Exception
'This catch block handles all Exception types.
'Details of the exception, in this case, are in the "ex" variable.
'You can show the error in a MessageBox with the below line.
MessageBox.Show(ex.Message)
Finally
'A finally block is always executed, regardless of if an Exception occurred.
End Try
サンプルコード:
Try
Dim obj = Nothing
Dim prop = obj.Name 'This line will throw a NullReferenceException
Console.WriteLine("Test.") ' This line will NOT be executed
Catch ex As System.IO.IOException
' Code that reacts to IOException.
Catch ex As NullReferenceException
' Code that reacts to a NullReferenceException
Console.WriteLine("NullReferenceException: " & ex.Message)
Console.WriteLine("Stack Trace: " & ex.StackTrace)
Catch ex As Exception
' Code that reacts to any other exception.
Finally
' This will always be run, regardless of if an exception is thrown.
Console.WriteLine("Completed")
End Try
カスタム例外の作成とスロー
カスタム例外を作成し、関数の実行中にスローすることができます。一般的なプラクティスとして、関数が定義された機能を達成できなかった場合にのみ例外をスローする必要があります。
Private Function OpenDatabase(Byval Server as String, Byval User as String, Byval Pwd as String)
if Server.trim="" then
Throw new Exception("Server Name cannot be blank")
elseif User.trim ="" then
Throw new Exception("User name cannot be blank")
elseif Pwd.trim="" then
Throw new Exception("Password cannot be blank")
endif
'Here add codes for connecting to the server
End function
データベース操作でキャッチしよう
Try..Catchを使用して、ロールバックステートメントをキャッチセグメントに配置して、データベース操作をロールバックすることができます。
Try
'Do the database operation...
xCmd.CommandText = "INSERT into ...."
xCmd.ExecuteNonQuery()
objTrans.Commit()
conn.Close()
Catch ex As Exception
'Rollback action when something goes off
objTrans.Rollback()
conn.Close()
End Try
捕らえられない例外
Catch ex As Exception
はすべての例外を処理できると主張していますが、1つの例外があります。
Imports System
Static Sub StackOverflow() ' Again no pun intended
StackOverflow()
End Sub
Static Sub Main()
Try
StackOverflow()
Catch ex As Exception
Console.WriteLine("Exception caught!")
Finally
Console.WriteLine("Finally block")
End Try
End Sub
おっと...コンソールに何も印刷されていないのに、捕捉されていないSystem.StackOverflowException
がありSystem.StackOverflowException
。 MSDNによると、
.NET Framework 2.0以降、try / catchブロックでStackOverflowExceptionオブジェクトをキャッチすることはできず、対応するプロセスはデフォルトで終了します。したがって、スタックオーバーフローを検出して防止するコードを記述する必要があります。
したがって、 System.StackOverflowException
はキャッチ可能ではありません。それに気をつけろ!
重大な例外
一般に、例外のほとんどはそれほど重大ではありませんが、有名なSystem.StackOverflowException
など、扱うことができない重大な例外がありSystem.StackOverflowException
。ただし、 System.OutOfMemoryException
、 System.BadImageFormatException
、およびSystem.InvalidProgramException
など、 Catch ex As Exception
によって隠される可能性のあるものもあります。正しく処理できない場合は、これらを残しておくのは良いプログラミング方法です。これらの例外を除外するには、ヘルパーメソッドが必要です。
Public Shared Function IsCritical(ex As Exception) As Boolean
Return TypeOf ex Is OutOfMemoryException OrElse
TypeOf ex Is AppDomainUnloadedException OrElse
TypeOf ex Is AccessViolationException OrElse
TypeOf ex Is BadImageFormatException OrElse
TypeOf ex Is CannotUnloadAppDomainException OrElse
TypeOf ex Is ExecutionEngineException OrElse ' Obsolete one, but better to include
TypeOf ex Is InvalidProgramException OrElse
TypeOf ex Is System.Threading.ThreadAbortException
End Function
使用法:
Try
SomeMethod()
Catch ex As Exception When Not IsCritical(ex)
Console.WriteLine("Exception caught: " & ex.Message)
End Try