throw;
rethrows the original exception and preserves its original stack trace.
throw ex;
throws the original exception but resets the stack trace, destroying all stack trace information until your catch
block.
NEVER write throw ex;
throw new Exception(ex.Message);
is even worse. It creates a brand new Exception
instance, losing the original stack trace of the exception, as well as its type. (eg, IOException
).
In addition, some exceptions hold additional information (eg, ArgumentException.ParamName
).
throw new Exception(ex.Message);
will destroy this information too.
In certain cases, you may want to wrap all exceptions in a custom exception object, so that you can provide additional information about what the code was doing when the exception was thrown.
To do this, define a new class that inherits Exception
, add all four exception constructors, and optionally an additional constructor that takes an InnerException
as well as additional information, and throw your new exception class, passing ex
as the InnerException
parameter. By passing the original InnerException
, you preserve all of the original exception's properties, including the stack trace.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…