CA1031: Do not catch general exception types
|
TypeName |
DoNotCatchGeneralExceptionTypes |
|
CheckId |
CA1031 |
|
Category |
Microsoft.Design |
|
Breaking Change |
Non-breaking |
A general exception such as System.Exception or System.SystemException is caught in a catch statement, or a general catch clause such as catch() is used.
Do not suppress a warning from this rule. Catching general exception types can hide run-time problems from the library user and can make debugging more difficult.
Note
|
|---|
|
Starting with the .NET Framework 4, the common language runtime (CLR) no longer delivers corrupted state exceptions that occur in the operating system and managed code, such as access violations in Windows, to be handled by managed code. If you want to compile an application in the .NET Framework 4 or later versions and maintain handling of corrupted state exceptions, you can apply the HandleProcessCorruptedStateExceptionsAttribute attribute to the method that handles the corrupted state exception. |
The following example shows a type that violates this rule and a type that correctly implements the catch block.
using System; using System.IO; namespace DesignLibrary { // Creates two violations of the rule. public class GenericExceptionsCaught { FileStream inStream; FileStream outStream; public GenericExceptionsCaught(string inFile, string outFile) { try { inStream = File.Open(inFile, FileMode.Open); } catch(SystemException e) { Console.WriteLine("Unable to open {0}.", inFile); } try { outStream = File.Open(outFile, FileMode.Open); } catch { Console.WriteLine("Unable to open {0}.", outFile); } } } public class GenericExceptionsCaughtFixed { FileStream inStream; FileStream outStream; public GenericExceptionsCaughtFixed(string inFile, string outFile) { try { inStream = File.Open(inFile, FileMode.Open); } // Fix the first violation by catching a specific exception. catch(FileNotFoundException e) { Console.WriteLine("Unable to open {0}.", inFile); } try { outStream = File.Open(outFile, FileMode.Open); } // Fix the second violation by re-throwing the generic // exception at the end of the catch block. catch { Console.WriteLine("Unable to open {0}.", outFile); throw; } } } }
Note