2009-10-07 7 views

risposta

12
  1. Sì, è possibile generare eccezioni non compatibile con CLS in .NET Framework, fino a quando si utilizza un linguaggio che permette, ad esempio, C++.
  2. No, non è possibile generare eccezioni compatibili con CLS in C#.
  3. No, prenderà tutte le eccezioni, poiché qualsiasi eccezione non conforme a CLS verrà incapsulata in RuntimeWrappedException, che deriva da Exception.
  4. Non si getta un RuntimeWrappedException, il CLR lo fa. MSDN ha una descrizione dettagliata, che cito qui:

    Alcune lingue, come C++, consentono di generare eccezioni di qualsiasi tipo gestito. Altre lingue, come Microsoft C# e Visual Basic, richiedono che ogni eccezione generata venga derivata dalla classe Exception. Per mantenere la compatibilità tra le lingue, Common Language Runtime (CLR) esegue il wrapping di oggetti che non derivano da Exception in un oggetto RuntimeWrappedException.

Se si desidera trattare CLS e le eccezioni non CLS in modo diverso, basta prendere nel giusto ordine:

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

Anche se il compilatore C# consente agli sviluppatori di lanciare solo gli oggetti di eccezione di derivazione, prima C# versione 2.0, il compilatore C# fatto consentono agli sviluppatori di catturare i non-CLS-compliant eccezioni utilizzando il codice in questo modo:

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

CLS lo consente ma non tutte le lingue lo fanno. Può essere fatto con C++/CLI ma non può con C#, VB.NET.

A partire da .Net Framework 2.0, tutte le eccezioni non CLS sono racchiuse all'interno di RuntimeWrappedException.

Poiché RuntimeWrappedException deriva da Exception, un'eccezione (Exception) rileva le eccezioni non CLS.

Da una RuntimeWrappedException è possibile accedere all'eccezione originale tramite la proprietà RuntimeWrappedException.WrappedException.

Problemi correlati