Procedura: intercettare un'eccezione non CLS

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

  1. 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.

  2. 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#)

RuntimeWrappedException