3 ways to leave your exception

Below is a small reference detailing the 3 ways to deal with throwing/re-throwing exceptions in C#.

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;
    	}
    }
}
Last updated on 09 September 2009

Comments

blog comments powered by Disqus