The try
statement provides a mechanism for catching exceptions that occur during execution of a block. The try
statement furthermore provides the ability to specify a block of code that is always executed when control leaves the try
statement.
There are three possible forms of try
statements:
try
block followed by one or more catch
blocks.try
block followed by a finally
block.try
block followed by one or more catch
blocks followed by a finally
block.When a catch
clause specifies a class-type, the type must be System.Exception
or a type that derives from System.Exception
.
When a catch
clause specifies both a class-type and an identifier, an exception variable of the given name and type is declared. The exception variable corresponds to a read-only local variable with a scope that extends over the catch
block. During execution of the catch
block, the exception variable represents the exception currently being handled. A compile-time error occurs if a catch
block attempts to assign to the exception variable or pass the exception variable as a ref
or out
parameter.
Unless a catch
clause includes an exception variable name, it is impossible to access the exception object in the catch
block.
A catch
clause that specifies neither an exception type nor an exception variable name is called a general catch
clause. A try
statement can only have one general catch
clause, and if one is present it must be the last catch
clause. A general catch
clause of the form
catch {...}
is precisely equivalent to
catch (System.Exception) {...}
An error occurs if a catch
clause specifies a type that is equal to or derived from a type that was specified in an earlier catch
clause. Because catch
clauses are examined in order of appearance to locate a handler for an exception, without this restriction it would be possible to write unreachable catch
clauses.
It is an error for a try
statement to contain a general catch
clause if the try
statement also contains a catch
clause for the System.Exception
type.
Within a catch
block, a throw
statement (§8.9.5) with no expression can be used to re-throw the exception that is currently being handled by the catch
block.
It is an error for a break
, continue
, or goto
statement to transfer control out of a finally
block. When a break
, continue
, or goto
statement occurs in a finally
block, the target of the statement must be within the same finally
block, or otherwise a compile-time error occurs.
It is an error for a return
statement to occur in a finally
block.
A try
statement is executed as follows:
try
block.try
block:
try
statement has a finally
block, the finally
block is executed.try
statement.try
statement during execution of the try
block:
catch
clauses, if any, 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:
catch
clause declares an exception variable, the exception object is assigned to the exception variable.catch
block.catch
block:
try
statement has a finally
block, the finally
block is executed.try
statement.try
statement during execution of the catch
block:
try
statement has a finally
block, the finally
block is executed.try
statement.try
statement has no catch
clauses or if no catch
clause matches the exception:
try
statement has a finally
block, the finally
block is executed.try
statement.The statements of a finally
block are always executed when control leaves a try
statement. This is true whether the control transfer occurs as a result of normal execution, as a result of executing a break
, continue
, goto
, or return
statement, or as a result of propagating an exception out of the try
statement.
If an exception is thrown during execution of a finally
block, the exception is propagated to the next enclosing try
statement. If another exception was in the process of being propagated, that exception is lost. The process of propagating an exception is further discussed in the description of the throw
statement (§8.9.5).
The try
block of a try
statement is reachable if the try
statement is reachable.
A catch
block of a try
statement is reachable if the try
statement is reachable.
The finally
block of a try
statement is reachable if the try
statement is reachable.
The end point of a try
statement is reachable both of the following are true:
try
block is reachable or the end point of at least one catch
block is reachable.finally
block is present, the end point of the finally
block is reachable.