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
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

veya gibi System.ExceptionSystem.SystemException genel bir özel durum bir catch deyimine yakalanmış veya gibi catch() 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 özel durum yakalanmamalı.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için daha belirli bir özel durum yakalayın veya bloktaki catch son deyim olarak genel özel durumu yeniden oluşturun.

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'den başlayarak, ortak dil çalışma zamanı (CLR), yönetilen kod tarafından işlenmek üzere windows'taki erişim ihlalleri gibi işletim sisteminde ve yönetilen kodda oluşan bozuk durum özel durumları 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 .

Çözümlemek için kod yapılandırma

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 yakalanmaya izin verilmeyenlerini yapılandırabilirsiniz. Örneğin, kuralın işleyicilere ile bayrak catch eklemesi gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini NullReferenceExceptionekleyin:

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)
  • Simgenin belge kimliği biçiminde bir T: ön ek içeren tam 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 adla 'ExceptionType' adlı 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 ilgili tam adlarla eşleştirir.

Bu seçenekleri 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.

Ö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 {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)
        {
            Console.WriteLine("Unable to open {0}.", 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 {0}.", outFile);
            throw;
        }
    }
}

CA2200: Yığın ayrıntılarını korumak için yeniden fırlatma