2011-01-29 39 views
8

He leído algunas introducciones de principiante a smalltalk y hay un tema que falta. Es manejo de errores. ¿Cómo se hace? ¿Los objetos arrojan algún tipo de excepciones? ¿Enviar algunos mensajes de error a alguien?smalltalk error handling

Respuesta

19

Para elevar una excepción:

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

para manejar una excepción:

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

Para manejar una excepción y utilizar parte de la información de la excepción:

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

Para asegurar algo siempre sucede (a la try finally):

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

Solo quiero señalar que junto al camino @Frank Shearar menciona que hay otra posibilidad. Quiero decir por diseño. En algún momento es más útil dejar que el que llama ahora qué problema está pasando.

El #on:do: es perfectamente aceptable, pero la mayoría de las veces no sabes qué poner como primer argumento. block on: ?? do: something.

Déjame un ejemplo. En realidad, hay un ejemplo de la biblioteca de Colección. Especialmente con respecto al diccionario.

aDict at: 4 

¿Qué pasa si 4 no está en el diccionario. Acaba de obtener un error simple que necesita atrapar en un #on:do:.

Pero hay una mejor manera de manejar esta situación:

aDict at: 4 ifAbsent: [^#noSuchThingAs4] 

Estás manejar el error el mismo que el #on:do: pero ahora usted sabe por qué. Entonces podría hacer eso en otro para manejar su error correctamente.

aConnection connectIfFailed: [ ^#maybeRetryHere ] 

Tenga en cuenta que es necesario poner el código de excepción en un bloque de modo que no será evaluar hasta que ocurra el error.

aDict at: 4 ifAbsentPut: self default 

pueden funcionar pero es incorrecto. Espero que te ayuden

+1

Buen punto: la gestión de errores de frecuencia al horno en las API en la forma ifAbsent. –