CA1031: Non rilevare tipi di eccezione generali
TypeName |
DoNotCatchGeneralExceptionTypes |
CheckId |
CA1031 |
Category |
Microsoft.Design |
Breaking Change |
Non sostanziale |
Causa
Un'eccezione generale quale System.Exception o System.SystemException viene rilevata in un'istruzione catch oppure viene utilizzata una clausola catch generale come catch().
Descrizione della regola
Le eccezioni generali non devono essere rilevate.
Come correggere le violazioni
Per correggere una violazione di questa regola, rilevare un'eccezione più specifica o generare nuovamente l'eccezione generale come ultima istruzione nel blocco catch.
Esclusione di avvisi
Non escludere un avviso da questa regola.Il rilevamento di tipi di eccezioni generali può nascondere i problemi di runtime all'utente della libreria e complicare il debug.
[!NOTA]
A partire da .NET Framework 4, il Common Language Runtime (CLR) non recapita più eccezioni di stato danneggiato che si verifichino nel sistema operativo e nel codice gestito, ad esempio le violazioni di accesso in Windows, per essere trattato dal codice gestito. Se si desidera compilare un'applicazione in .NET Framework 4 (o versioni successive) e gestire le eccezioni di stato danneggiate, è possibile applicare l'attributo HandleProcessCorruptedStateExceptionsAttribute al metodo che gestisce l'eccezione di stato danneggiata.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che viola questa regola e un tipo che implementa correttamente il blocco catch.
Imports System
Imports System.IO
Namespace DesignLibrary
' Creates two violations of the rule.
Public Class GenericExceptionsCaught
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
Catch ex As SystemException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
Catch
Console.WriteLine("Unable to open {0}.", outFile)
End Try
End Sub
End Class
Public Class GenericExceptionsCaughtFixed
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
' Fix the first violation by catching a specific exception.
Catch ex As FileNotFoundException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
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
End Try
End Sub
End Class
End Namespace
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;
}
}
}
}
using namespace System;
using namespace System::IO;
namespace DesignLibrary
{
// Creates two violations of the rule.
public ref 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(Exception^ e)
{
Console::WriteLine("Unable to open {0}.", outFile);
}
}
};
public ref 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(Exception^ e)
{
Console::WriteLine("Unable to open {0}.", outFile);
throw;
}
}
};
}
Regole correlate
CA2200: Eseguire il rethrow per conservare i dettagli dello stack