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

May 10, 2014

1 minute read

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.

Background

So here’s a typical example of the throw vs throw ex thing: https://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex

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: http://stackoverflow.com/a/776756/10245

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 https://gist.github.com/timabell/78610f588961bd0a0b95

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.


Share as Tweet || Share on LinkedIn
Post source code on GitHub - suggestions & PRs welcome!
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 buttondown.email.