2013-07-03 14 views
14

Qual è l'equivalente di C# a Java Throwable?Qual è l'equivalente di C# a Throwable di Java?

In Java, la radice della gerarchia di classi eccezione si chiama Throwable, nonException. La classe base Throwable ha due classi derivate:

Exception: per le condizioni che un'applicazione ragionevole potrebbe voler rilevare.

Error: per problemi seri che un programma ragionevole non dovrebbe cercare di catturare.

Quindi la classe di base Throwable include problemi che un programma ragionevole non dovrebbe tentare di rilevare.

+1

@tieTYT indovinare la gente pensa che sia facile da guardare? – Daniel

+1

@Daniel vedo. Non sapevo che si trattava di un reato in grado di ridurre al minimo. –

+5

Non penso che questa domanda sia tanto grave come suggerisce il voto - Java ha una classe 'Throwable' separata dalla sua classe' Exception', che non è qualcosa che si associa direttamente a C#."Guardando in alto" qualcosa che non esiste non è sempre semplice, specialmente se ti aspetti che sia da qualche parte ... –

risposta

12

Quello sarebbe il Exception class. Non esiste un concetto "gettato" separato oltre alle eccezioni in .NET.

+0

(Non posso votare perché non so cosa sia "lanciabile" - vergogna). Non puoi buttare tutto ciò che vuoi in C++/CLI? Ho pensato che la restrizione 'Exception' è solo per Common Language Specification - codice compatibile, ma non .Net in generale ... –

+0

@AlexeiLevenkov Non credo che C++/CLI lo permetta, o - il CLR ti permetterà di lanciare qualsiasi oggetto, ma CLS richiede che l'oggetto derivi da "Exception". Non credo che le lingue correnti (che ho visto) ti permettano di lanciare una non eccezione, diversa da null. –

+0

Cercare di verificare se possibile - MSDN dice che si trova in [String (C++ Component Extensions)] (http://msdn.microsoft.com/en-us/library/vstudio/ms177218.aspx). Non sono sicuro di come funzioni effettivamente ... forse lo converte in/da un'eccezione. –

0

.Net consente eccezioni di qualsiasi classe, ma C# limita il lancio e la cattura su Eccezione. Utilizzare una clausola catch che non specifica né il tipo né la variabile per rilevare le eccezioni di eccezione.

Il frammento di specifiche rilevanti:

Quando una clausola catch specifica una classe-tipo, il tipo deve essere System.Exception, un tipo che deriva da System.Exception o un tipo di parametro tipo che ha di sistema. Eccezione (o una sottoclasse degli stessi) come classe base effettiva.

Quando una clausola catch specifica sia un tipo di classe che un identificatore, viene dichiarata una variabile di eccezione del nome e del tipo specificati. La variabile di eccezione corrisponde a una variabile locale con un ambito che si estende sopra il blocco catch. Durante l'esecuzione del blocco catch, la variabile exception rappresenta l'eccezione attualmente gestita. Ai fini del controllo preciso dell'assegnazione, la variabile di eccezione è considerata definitivamente assegnata in tutto il suo ambito.

A meno che una clausola di cattura non includa un nome di variabile di eccezione, è impossibile accedere all'oggetto di eccezione nel blocco di cattura.

Una clausola catch che non specifica né un tipo di eccezione né un nome di variabile di eccezione viene definita clausola di catch generale. Una dichiarazione try può avere solo una clausola catch generale e, se presente, deve essere l'ultima clausola catch.

Alcuni linguaggi di programmazione possono supportare eccezioni che non sono rappresentabili come un oggetto derivato da System.Exception, sebbene tali eccezioni non possano mai essere generate dal codice C#. Una clausola di cattura generale può essere utilizzata per rilevare tali eccezioni. Pertanto, una clausola di cattura generale è semanticamente diversa da quella che specifica il tipo System.Exception, in quanto la prima può anche rilevare eccezioni da altre lingue.

.Net 4.0 introduce un concetto simile alla classe Error di Java. Mentre le Eccezioni di stato danneggiato estendono l'eccezione, solo i metodi con HandleProcessCorruptedStateExceptionsAttribute catturano i CSE.

Problemi correlati