Aracılığıyla paylaş


CLS dışı özel durumu yakalama

C++/CLI dahil olmak üzere bazı .NET dilleri, nesnelerin 'den Exceptiontüretilmeyen özel durumlar oluşturmasına izin verir. Bu tür özel durumlar CLS dışı özel durumlar veya Özel Durum olmayanlar olarak adlandırılır. C# dilinde CLS dışı özel durumlar oluşturamazsınız, ancak bunları iki şekilde yakalayabilirsiniz:

  • Bir catch (RuntimeWrappedException e) blok içinde.

    Varsayılan olarak, Visual C# derlemesi CLS olmayan özel durumları sarmalanmış özel durumlar olarak yakalar. Özelliği aracılığıyla RuntimeWrappedException.WrappedException erişilebilen özgün özel duruma erişmeniz gerekiyorsa bu yöntemi kullanın. Bu konunun devamında yer alan yordamda özel durumların bu şekilde nasıl yakalanacakları açıklanmaktadır.

  • Genel bir catch bloğu içinde (özel durum türü belirtilmemiş bir catch bloğu), diğer catch tüm blokların arkasına konur.

    CLS olmayan özel durumlara yanıt olarak bazı eylemler (günlük dosyasına yazma gibi) gerçekleştirmek istediğinizde ve özel durum bilgilerine erişmeniz gerekmiyorsa bu yöntemi kullanın. Varsayılan olarak ortak dil çalışma zamanı tüm özel durumları sarmalar. Bu davranışı devre dışı bırakmak için, genellikle AssemblyInfo.cs dosyasındaki kodunuza bu derleme düzeyi özniteliğini ekleyin: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

CLS olmayan bir özel durumu yakalamak için

Bir catch(RuntimeWrappedException e) blok içinde, özelliği aracılığıyla özgün özel duruma erişin RuntimeWrappedException.WrappedException .

Örnek

Aşağıdaki örnek, C++/CLI ile yazılmış bir sınıf kitaplığından oluşturulmuş CLS olmayan bir özel durumun nasıl yakalandığını gösterir. Bu örnekte C# istemci kodunun, atılmakta olan özel durum türünün bir System.Stringolduğunu önceden bildiğini unutmayın. Bu tür kodunuzdan RuntimeWrappedException.WrappedException erişilebilir olduğu sürece özelliği özgün türünü geri alabilirsiniz.

// Class library written in C++/CLI.
var myClass = new ThrowNonCLS.Class1();

try
{
    // throws gcnew System::String(  
    // "I do not derive from System.Exception!");  
    myClass.TestThrow();
}
catch (RuntimeWrappedException e)
{
    String s = e.WrappedException as String;
    if (s != null)
    {
        Console.WriteLine(s);
    }
}

Ayrıca bkz.