The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 2,057 other followers

.NET/C#: a generic exception class

Posted by jpluimers on 2010/07/28

I want my exceptions to be bound to my business classes.
So you need your own exception class, and are expected to override the 4 constructors of the Exception class.

But I got a bit tired of writing code like this again and again:

using System;
using System.Runtime.Serialization;

namespace bo.Sandbox
{
    public class MyException : Exception
    {
        public MyException()
            : base()
        {
        }

        public MyException(string message)
            : base(message)
        {
        }

        public MyException(string message, MyException inner)
            : base(message, inner)
        {
        }

        public MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }
}

Searching for Generic Exception Class did not reveal any generic exception classes.
So I wrote this instead:

using System;
using System.Runtime.Serialization;

namespace bo.Sandbox
{
    public class Exception<T> : Exception
    {
        public Exception()
            : base()
        {
        }

        public Exception(string message)
            : base(message)
        {
        }

        public Exception(string message, Exception inner)
            : base(message, inner)
        {
        }

        public Exception(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }
}

Now I can raise and catch exceptions like this:

using System;

namespace bo.Sandbox
{
    public class My
    {
        public static void ShowGenericException()
        {
            try
            {
                throw new Exception<My>("Oops");
            }
            catch (Exception<My> ex)
            {
                Console.WriteLine(ex.ToString());
                throw;
            }
        }
    }
}

It will write something like this to the console:

bo.Sandbox.Exception`1[bo.Sandbox.My]: Oops
at bo.Sandbox.My.ShowGenericException() in C:\develop\VS2008\Projects\bo.SandBox.Console\bo.SandBox.Console\Program.cs:line 12

Note however that there is a bug when passing your Exception class as a generic type.
This is a known bug (fixed in Visual Studio 2010), and mentioned on stackoverflow twice.

So: this code will fail under the debugger from Visual Studio 2005 and 2008; you will need to have Visual Studio 2010 to have this example work:

using System;
using System.Runtime.Serialization;

namespace bo.Sandbox
{
    public class My
    {
        static void RunTest<T>()
            where T : Exception, new()
        {
            try
            {
                throw new T();
            }
            catch (T ex)
            {
                Console.WriteLine("Caught passed in exception type");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught general exception");
            }
            Console.Read();
        }

        public static void Main()
        {
            RunTest<Exception<My>>();
        }
    }
}

Conclusions:

  • Having a generic exception class is neat: it makes throwing and catching a breeze.
  • But be careful passing the class itself around as a generic type: under the debugger, this fails under Visual Studio 2008 and 2005.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

 
%d bloggers like this: