Is there a difference between throw and throw ex?
Yes, there is a difference.
throw ex
resets the stack trace (so your errors would appear to originate fromHandleException
)throw
doesn't - the original offender would be preserved.static void Main(string[] args)
{
try
{
Method2();
}
catch (Exception ex)
{
Console.Write(ex.StackTrace.ToString());
Console.ReadKey();
}
}
private static void Method2()
{
try
{
Method1();
}
catch (Exception ex)
{
//throw ex resets the stack trace Coming from Method 1 and propogates it to the caller(Main)
throw ex;
}
}
private static void Method1()
{
try
{
throw new Exception("Inside Method1");
}
catch (Exception)
{
throw;
}
}
Not finding any difference between throw vs throw ex in C#
The problem that you're not seeing is that the possible throw locations you're working with are so close together as to be indistinguishable when the stack trace is collected.
Try instead:
public void Test()
{
try
{
Deeper();
}
catch (Exception ex)
{
throw; //throw statement
}
}
private static void Deeper()
{
int a = 10;
int b = 10;
int c = 10 / (a - b);
}
The throw;
variant will show you Deeper
in the stack trace. throw ex;
will only show Test
as the deepest level.
In C++, is there a difference between “throw” and “throw ex”?
throw;
rethrows the same exception object it caught while throw ex;
throws a new exception. It does not make a difference other than the performance reasons of creating a new exception object. If you have a exception hierarchy where there some other exception classes derived from MyException
class and while throwing an exception you have done a throw DerivedClassException;
it can be caught by the catch(MyException&)
. Now if you modify this caught exception object and rethrow it using throw;
the type of exception object will still be DerivedClassException
. If you do throw Ex;
the object slicing occurs and the newly thrown exception will be of type MyException
.
Difference between 'throw' and 'throw new Exception()'
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.
Is there a difference between throw(e) and throw e in typescript?
throw
in TypeScript (and in javascript) can throw arbitrary expression. Unlike if
, while
and for
, throw
can be followed by the expression immediately, without surrounding the expression in ()
.
From the expression semantic point of view, these two expressions are identical:
e
and
(e)
Difference between throw(e) and throw e?
Quite a few languages allow as many parenthesis around expressions as you want. Java is one of them. The following is perfectly valid code.
public class HelloWorld {
public static void main(String[] args) {
throw ((((new RuntimeException()))));
}
}
So there's absolutely no difference, except that your source file is two bytes larger.
Related Topics
What Do 'Statically Linked' and 'Dynamically Linked' Mean
How to Implement Custom Jsonconverter in Json.Net
Why Not Inherit from List≪T≫
Converting a String to Datetime
Difference Between a Field and a Property
How to Force My .Net Application to Run as Administrator
Case Insensitive 'Contains(String)'
How and When to Use 'Async' and 'Await'
Why Is It Important to Override Gethashcode When Equals Method Is Overridden
What Does the [Flags] Enum Attribute Mean in C#
How to Parse a Json String That Would Cause Illegal C# Identifiers