CA1031: 일반적인 예외 형식을 catch하지 마십시오.
TypeName |
DoNotCatchGeneralExceptionTypes |
CheckId |
CA1031 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 |
원인
System.Exception 또는 System.SystemException과 같은 일반 예외가 catch 문에서 catch되거나 catch()와 같은 일반 catch 절이 사용되었습니다.
규칙 설명
일반 예외는 catch하면 안 됩니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 보다 구체적인 예외를 catch하거나 일반 예외를 catch 블록의 마지막 문으로 다시 throw합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.일반 예외 형식을 catch하면 런타임 문제가 라이브러리 사용자에게 표시되지 않고 디버깅이 복잡해질 수 있습니다.
[!참고]
.NET Framework 4부터 CLR(공용 언어 런타임)은 관리되는 코드에서 처리할 Windows의 액세스 위반 같은 운영 체제와 관리되는 코드에서 발생하는 손상된 상태 예외를 더 이상 제공하지 않습니다. .NET Framework 4 이상 버전에서 응용 프로그램을 컴파일하고 손상된 상태 예외의 처리를 유지하려는 경우 손상된 상태 예외를 처리하는 메서드에 HandleProcessCorruptedStateExceptionsAttribute 특성을 적용할 수 있습니다.
예제
다음 예제에서는 이 규칙을 위반하는 형식과 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;
}
}
};
}