2011-01-29 14 views
8

Ho letto alcune introduzioni per principianti a smalltalk e manca un argomento. È la gestione degli errori. Com'è fatto? Gli oggetti lanciano qualche tipo di eccezione? Invia alcuni messaggi di errore a qualcuno?gestione errori smalltalk

risposta

19

Per sollevare un'eccezione:

MyException signal. 
MyException signal: 'With an error message'. 

Per gestire un'eccezione:

[ 1/0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!']. 

Per gestire un'eccezione e utilizzare alcune delle informazioni del eccezione:

[ 1/0 ] on: Error do: 
    [:e | Transcript showln: 'Oops! ' , e className , '!']. 

Per garantire qualcosa sempre succede (a la try finally):

[ 1/0 ] ensure: [ Transcript showln: 'This will always run' ] 
5

Voglio solo far notare che accanto alla frase @Frank Shearar c'è un'altra possibilità. Intendo per design. Qualche volta è più utile lasciare al chiamante ora quale problema sta andando.

Il #on:do: è perfettamente accettabile, ma la maggior parte delle volte non si sa cosa mettere in primo piano. block on: ?? do: something.

Lasciatemi fare un esempio. In realtà c'è un esempio dalla libreria Collection. Soprattutto per quanto riguarda il dizionario.

aDict at: 4 

Ecco che cosa succederebbe se 4 non è presente nel dizionario. Hai solo un semplice errore che devi prendere in un #on:do:.

Ma c'è un modo migliore per gestire questa situazione:

aDict at: 4 ifAbsent: [^#noSuchThingAs4] 

Sei gestire l'errore lo stesso del #on:do: ma ora sapete perché. Quindi potresti farlo in un altro modo per gestire correttamente il tuo errore.

aConnection connectIfFailed: [ ^#maybeRetryHere ] 

Essere consapevoli del fatto che è necessario mettere il codice di eccezione in un blocco in modo che non sarà valutare fino a che l'errore accade.

aDict at: 4 ifAbsentPut: self default 

può funzionare ma è sbagliato. Spero che ti aiuti.

+1

Buon punto: la gestione degli errori di spesso cotto in API in modo ifAbsent. –