The throw
statement throws an exception.
A throw
statement with an expression throws the exception produced by evaluating the expression. The expression must denote a value of the class type System.Exception
or of a class type that derives from System.Exception
. If evaluation of the expression produces null
, a NullReferenceException
is thrown instead.
A throw
statement with no expression can be used only in a catch
block. It re-throws the exception that is currently being handled by the catch
block.
Because a throw
statement unconditionally transfers control elsewhere, the end point of a throw
statement is never reachable.
When an exception is thrown, control is transferred to the first catch
clause in a try
statement that can handle the exception. The process that takes place from the point of the exception being thrown to the point of transferring control to a suitable exception handler is known as exception propagation. Propagation of an exception consists of repeatedly evaluating the following steps until a catch
clause that matches the exception is found. In the descriptions, the throw point is initially the location at which the exception is thrown.
try
statement that encloses the throw point is examined. For each statement S
, starting with the innermost try
statement and ending with the outermost try
statement, the following steps are evaluated:
try
block of S
encloses the throw point and if S has one or more catch
clauses, the catch
clauses are examined in order of appearance to locate a suitable handler for the exception. The first catch
clause that specifies the exception type or a base type of the exception type is considered a match. A general catch
clause is considered a match for any exception type. If a matching catch
clause is located, the exception propagation is completed by transferring control to the block of that catch
clause.try
block or a catch
block of S
encloses the throw point and if S
has a finally
block, control is transferred to the finally
block. If the finally
block throws another exception, processing of the current exception is terminated. Otherwise, when control reaches the end point of the finally
block, processing of the current exception is continued.