throw vs throw ex vs wrap and throw in c-sharp

1 minute read (250 words)

I’ve come across the throw vs throw ex ‘debate’ a few times, even as an interview question, and it’s always bugged me because it’s never something I’ve worried about in my own c# code.


So here’s a typical example of the throw vs throw ex thing:

Basically it revolves around either messing up the line numbers in your stack trace (throw ex;) or losing a chunk of your stack entirely (throw;) - exception1 and 2 respectively in this nice clear answer:

Smiley face in a coffee stain

The third option

I’ve just figured out why it’s never been an issue for me.

Because in my own code, whenever I catch and re-throw I always wrap another exception to add more context before rethrowing, and this means you don’t have either of the above problems. For example:

private static void ThrowException3() {
    try {
        DivByZero(); // line 43
    } catch (Exception ex) {
        throw new Exception("doh", ex); // line 45

Exception 3:

System.Exception: doh ---> System.DivideByZeroException: Division by zero
  at puke.DivByZero () [0x00002] in /home/tim/repo/puker/puke.cs:51
  at puke.ThrowException3 () [0x00000] in /home/tim/repo/puker/puke.cs:43
  --- End of inner exception stack trace ---
  at puke.ThrowException3 () [0x0000b] in /home/tim/repo/puker/puke.cs:45
  at puke.Main (System.String[] args) [0x00040] in /home/tim/repo/puker/puke.cs:18

Obviously ‘doh’ would be something meaningful about the state of that function ThrowException3() in the real world.

Full example with output at

This makes life much easier when tracking down bugs / state problems later on. Particularly if you string.Format() the new message and add some useful state info.

Tweet This || Post to LinkedIn || Page Source

Subscribe for updates on software development, contracting, side projects, blog posts and who knows what else. Read the archives for an idea of content.

Mailing list powered by the excellent