Aracılığıyla paylaş


CA1031: Genel özel durum türlerini yakalamayın

Özellik Değer
Kural Kimliği CA1031
Başlık Genel özel durum türlerini yakalamayın
Kategori Tasarım
Değişikliği bozucu veya bozmayan bir düzeltme Kesintisiz
.NET 9'da varsayılan olarak etkin Hayır

Neden

System.Exception veya System.SystemException gibi genel bir istisna durumu bir catch deyiminde yakalanır veya catch() gibi genel bir catch yan tümcesi kullanılır.

Varsayılan olarak, bu kural yalnızca yakalanan genel özel durum türlerini işaretler, ancak bu yapılandırılabilir.

Kural açıklaması

Genel istisnalar yakalanmamalı.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için daha belirli bir özel durum yakalayın veya catch bloğundaki son deyim olarak genel bir özel durumu tekrar fırlatın.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan uyarıyı bastırmayın. Genel özel durum türlerini yakalamak, çalışma zamanı sorunlarını kitaplık kullanıcısından gizleyebilir ve hata ayıklamayı zorlaştırabilir.

Not

.NET Framework 4'ten itibaren, ortak dil çalışma zamanı (CLR), Windows'taki erişim ihlalleri gibi işletim sistemi ve yönetilen kodda oluşan bozuk durum özel durumlarını yönetilen kod tarafından ele alınmak üzere sunmaz. .NET Framework 4 veya sonraki sürümlerinde bir uygulama derlemek ve bozuk durum özel durumlarının işlenmesini sürdürmek istiyorsanız, özniteliğini bozuk durum özel durumunu işleyen yönteme uygulayabilirsiniz HandleProcessCorruptedStateExceptionsAttribute .

Kodları çözümlemek için yapılandırın

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.

Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Tasarım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

İzin verilmeyen özel durum türü adları

Hangi özel durum türlerinin yakalanmasına izin verilmeyeceğini yapılandırabilirsiniz. Örneğin, catch ve NullReferenceException ile işaretlenecek işleyicileri belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException

Seçenek değerinde izin verilen tür adı biçimleri (ile |ayrılmış):

  • Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın ada sahip tüm simgeleri içerir)
  • T: ön ek ile simgenin belge kimliği biçimindeki tam nitelikli adlar.

Örnekler:

Seçenek değeri Özet
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType Derlemedeki 'ExceptionType' adlı tüm sembolleri eşleştirir.
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 Derlemedeki 'ExceptionType1' veya 'ExceptionType2' adlı tüm sembolleri eşleştirir.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType Verilen tam nitelikli ad ile 'ExceptionType' adı verilen belirli türleri eşleştirir.
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 'ExceptionType1' ve 'ExceptionType2' adlı türleri, bunların tam nitelikli adlarıyla eşleştirir.

Bu seçenekleri yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki tüm kurallar için (Tasarım) yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Örnek

Aşağıdaki örnekte bu kuralı ihlal eden bir tür ve bloğu doğru uygulayan bir tür gösterilmektedir catch .

Imports System
Imports System.IO

Namespace ca1031

    ' 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)
                ' For functionally equivalent code, also catch the
                ' remaining exceptions that may be thrown by File.Open
            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
// 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)
        {
            Console.WriteLine($"Unable to open {inFile}.");
        }

        try
        {
            outStream = File.Open(outFile, FileMode.Open);
        }
        catch
        {
            Console.WriteLine($"Unable to open {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)
        {
            Console.WriteLine($"Unable to open {inFile}.");
        };

        // For functionally equivalent code, also catch 
        // remaining exceptions that may be thrown by File.Open

        try
        {
            outStream = File.Open(outFile, FileMode.Open);
        }

        // Fix the second violation by rethrowing the generic 
        // exception at the end of the catch block.
        catch
        {
            Console.WriteLine($"Unable to open {outFile}.");
            throw;
        }
    }
}

CA2200: Yığın ayrıntılarını korumak amacıyla yeniden fırlatma