Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
Alcuni linguaggi .NET, incluso C++/CLI, consentono agli oggetti di generare eccezioni che non derivano dalla classe Exception. Tali eccezioni sono chiamate eccezioni non CLS o non eccezioni. In Visual C# non è possibile generare eccezioni non CLS, ma è possibile intercettarle in due modi:
All'interno di un blocco catch (Exception e) come classe RuntimeWrappedException.
Per impostazione predefinita, in Visual C# un assembly intercetta eccezioni non CLS come eccezioni wrapped. Utilizzare questo metodo se è necessario accedere all'eccezione originale, a cui è possibile accedere tramite la proprietà WrappedException. Nella procedura descritta più avanti in questo argomento viene illustrato come intercettare le eccezioni in questo modo.
All'interno di un blocco catch generale (un blocco catch senza tipo di eccezione specificato) posizionato dopo un blocco catch (Exception) o catch (Exception e).
Utilizzare questo metodo se si desidera eseguire un'azione (ad esempio la scrittura in un file di log) in risposta alle eccezioni non CLS e non è necessario accedere alle informazioni sull'eccezione. Per impostazione predefinita, Common Language Runtime esegue il wrapping di tutte le eccezioni. Per disattivare questo comportamento, aggiungere questo attributo a livello di assembly al codice, in genere nel file AssemblyInfo.cs: [assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].
Per intercettare un'eccezione non CLS
All'interno di un catch(Exception e) block utilizzare la parola chiave as per verificare se è possibile eseguire il cast di e nella classe RuntimeWrappedException.
Accedere all'eccezione originale tramite la proprietà WrappedException.
Esempio
Nell'esempio seguente viene illustrato come intercettare un'eccezione non CLS generata da una libreria di classi scritta in C++/CLR. Si noti che in questo esempio il codice client di Visual C# sa in anticipo che il tipo di eccezione generato è System.String. È possibile eseguire il cast della proprietà WrappedException al tipo originale a condizione che tale tipo sia accessibile dal codice.
// Class library written in C++/CLR.
ThrowNonCLS.Class1 myClass = new ThrowNonCLS.Class1();
try
{
// throws gcnew System::String(
// "I do not derive from System.Exception!");
myClass.TestThrow();
}
catch (Exception e)
{
RuntimeWrappedException rwe = e as RuntimeWrappedException;
if (rwe != null)
{
String s = rwe.WrappedException as String;
if (s != null)
{
Console.WriteLine(s);
}
}
else
{
// Handle other System.Exception types.
}
}
Vedere anche
Riferimenti
Eccezioni e gestione delle eccezioni (Guida per programmatori C#)