3 ways to leave your exception
September 08, 2009
Below is a small reference showing, by example, the 3 ways of throwing/re-throwing exceptions in C#, and their outcomes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
// Output: | |
// | |
// Invalid operation: Could not find file 'C:\this doesnt exist.txt'. | |
// Could not find file 'C:\this doesnt exist.txt'. | |
// Could not find file 'C:\this doesnt exist.txt'. | |
// | |
try | |
{ | |
ThrowTest.ThrowNew(); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
try | |
{ | |
ThrowTest.Throw(); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
try | |
{ | |
ThrowTest.ThrowEx(); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
Console.ReadLine(); | |
} | |
} | |
public class ThrowTest | |
{ | |
public static void ThrowNew() | |
{ | |
try | |
{ | |
File.OpenText(@"C:\this doesnt exist.txt"); | |
} | |
catch (IOException ex) | |
{ | |
// InnerException is null, and the stacktrace starts at ThrowNew() | |
throw new InvalidOperationException("Invalid operation: " + ex.Message); | |
} | |
} | |
public static void Throw() | |
{ | |
try | |
{ | |
File.OpenText(@"C:\this doesnt exist.txt"); | |
} | |
catch (IOException ex) | |
{ | |
// This maintains the entire stacktrace, so will include the chain that occured inside the Framework, | |
// i.e. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) | |
throw; | |
} | |
} | |
public static void ThrowEx() | |
{ | |
try | |
{ | |
File.OpenText(@"C:\this doesnt exist.txt"); | |
} | |
catch (IOException ex) | |
{ | |
// InnerException is null, and the stacktrace starts at ThrowEx(). It's the least useful of the three. | |
throw ex; | |
} | |
} | |
} |
I'm Chris Small, a software engineer working in London. This is my tech blog. Find out more about me via Github, Stackoverflow, Resume