I am writing an application in C# that requires me to create an Array object on the fly from some dimensions the user passes in. The Array.CreateInstance() method can throw (by last count) 6 different exceptions that I would want to handle. For each exception I would want to inform the user by a simple MessageBox.Show() and a message tailored to the exceptional circumstance. What I do not want to do is catch the general Exception type, because it is a best practice to not do so. I would try catching ArgumentException or something more specific, but the only common superclass to all of the exceptions is Exception.
Bottom Line: I am trying to figure out the best way to handle having so many different exceptions, and what would be an efficient and, more importantly, maintainable solution.
try
{
data = Array.CreateInstance(TypeHelper.StringToType(cbDataType.SelectedItem.ToString()), dimensions);
}
catch (OutOfMemoryException) { }
catch (NullReferenceException) { }
catch (NotSupportedException) { }
catch (ArgumentNullException) { }
catch (ArgumentOutOfRangeException) { }
catch (ArgumentException) { }
Of that list there are only 4 exceptions I would consider catching:
NotSupportedExceptionArgumentNullExceptionArgumentOutOfRangeExceptionArgumentExceptionThe other two you should never catch, and as of the later CLR’s you can’t catch an OOM situation (consider MemoryFailPoint if you need to find out).
Delving deeper into
Array.CreateInstance, we see why each of those four would be thrown:NotImplementedException: the type you gave it can’t be an array, or is an open generic. Since you are pulling these data types from a fixed list, you should know a priori that these are valid types. I would argue against handling this exception.ArgumentNullException: you should be certain all of the arguments you pass are not null, thus this will never happen and you should not handle this exception.ArgumentOutOfRangeException: one of the lengths is less than 0, which you can test a priori, thus you should not handle this exception.ArgumentException: Thrown if the type is invalid (you’ve already made sure it is valid) or if there aren’t enough lengths, which you can test a priori.So, my suggested code would be:
In summary, I would not handle any exceptions since you should be able to prevent all of them from occurring and you shouldn’t care about the instances where you can’t possibly handle the exception.