2009-10-07 9 views

Odpowiedz

12
  1. Tak, można rzucać wyjątki nie zgodny z CLS w .NET Framework, jak długo, jak używać języka, który na to pozwala, na przykład C++.
  2. Nie, nie można rzucić wyjątków niezgodnych z CLS w języku C#.
  3. Nie, będzie przechwytywał wszystkie wyjątki, ponieważ każdy wyjątek niezgodny z CLS będzie zawijany w RuntimeWrappedException, który pochodzi od Exception.
  4. Nie rzuca się RuntimeWrappedException, robi to CLR. MSDN ma szczegółowy opis, który tu zacytuję:

    Niektóre języki, takie jak C++, umożliwiają zgłaszanie wyjątków dowolnego zarządzanego typu. Inne języki, takie jak Microsoft C# i Visual Basic, wymagają, aby każdy zgłoszony wyjątek pochodził z klasy Wyjątek. Aby zachować kompatybilność między językami, środowisko wykonawcze języka wspólnego (CLR) opakowuje obiekty, które nie pochodzą z wyjątku w obiekcie RuntimeWrappedException.

Jeśli chcesz traktować CLS i wyjątki non-CLS inaczej, po prostu złapać je w odpowiedniej kolejności:

try { 
    // some code 
catch(RuntimeWrappedException ex) { 
    // non-CLS exceptions 
catch(Exception ex) { 
    // CLS exceptions 
} 
1

Chociaż C# kompilator pozwala programistom rzucić tylko obiekty wyjątku pochodzą, przed C# w wersji 2.0, C# kompilator nie pozwoli programistom złapać non-CLS zgodne wyjątków za pomocą kodu:

private void SomeMethod() { 
try { 
// Inside the try block is where you put code requiring 
// graceful recovery or common cleanup operations. 
} 
catch (Exception e) { 
// Before C# 2.0, this block catches CLS-compliant exceptions only 
// In C# 2.0, this block catches CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
} 
catch { 
// In all versions of C#, this block catches 
// CLS- & non-CLS- compliant exceptions 
throw; // Re-throws whatever got caught 
} 
} 
1

System CLS pozwala na to, ale nie we wszystkich językach. Można to zrobić za pomocą C++/CLI, ale nie można tego zrobić za pomocą C#, VB.NET.

Począwszy od .Net Framework 2.0, wszystkie wyjątki poza CLS są pakowane wewnątrz RuntimeWrappedException.

Ponieważ wyjątek RuntimeWrappedException wywodzi się z wyjątku, catch (wyjątek) będzie przechwytywał wyjątki inne niż CLS.

Z poziomu wyjątku RuntimeWrappedException można uzyskać dostęp do oryginalnego wyjątku za pomocą właściwości RuntimeWrappedException.WrappedException.

Powiązane problemy