2017-01-13 6 views
1

Angenommen, ich habe die folgende Methode:Smalltalk Fehler bei Transcript Umgang

MyClass>>addCategory: aCategory toEvent: anEvent 
    | cat | 
    cat := anEvent addCategory: aCategory 
    ... 

Jetzt kann das Verfahren #addCategory entweder ein anderes Objekt zurück (zum Beispiel etwas von Klasse Foo) oder einen Fehler aus (mit Error signal: 'message').

  • Im Falle eines Fehlers möchte ich die Nachricht des Fehlers auf dem Transcript drucken.
  • Im Falle eines Objekts möchte ich eine Nachricht auf dem Transcript (z. B. Transcript show: 'Category added!') drucken und das Objekt zurückgeben.

Ich habe bei aBlock ifError: aBlock, so etwas wie folgt aussehen:

MyClass>>addCategory: aCategory toEvent: anEvent 
    | cat | 
    cat := [anEvent addCategory: aCategory] ifError: [ :err | Transcript show: err. ] 
    ... 

Aber ich kann nicht ganz herausfinden, wie die Variable cat danach zu handhaben, um das Verhalten Ich möchte zu bekommen.

+0

Welches Verhalten möchten Sie? Was soll "Katze" sein, wenn kein Fehler versus Fehler vorliegt? – lurker

+0

@lurker Im Falle eines Fehlers wird 'cat' von der Klasse' Foo' sein und ich möchte es zurückgeben. Im Falle eines Fehlers möchte ich nur den Fehler ausdrucken. Ich brauche in diesem Fall keine Katze mehr. – JNevens

Antwort

3

Hier ist eine andere Möglichkeit, das Gleiche zu tun. Die Idee ist, den Code zu umschließen, als ob würde es nicht scheitern und wickelt mit einem on: Error

MyClass>>addCategory: aCategory toEvent: anEvent 
    | cat | 
    [ 
    cat := anEvent addCategory: aCategory. 
    Transcript show: 'Category added!'] 
    on: Error 
    do: [:err | Transcript show: err messageText]. 
^cat 

Beachten Sie, dass cat nicht bei Error zugewiesen bekommen und somit wird das Verfahren mit nil beantworten. Beachten Sie auch, dass ^nil nicht innerhalb des Error-Handler-Blocks benötigt wird.

Denken Sie daran, dass die Idee von on:do: Ihnen erlaubt, naiven Code zu schreiben und dann mögliche Fehlerbedingungen zu behandeln, ohne sie in den fehlerfreien Abschnitt Ihres Codes einzubetten.

[ 
<my naive 
and clean 
lines of code>] on: Error do: [:err | oops!] 

Ihre Lösung ist in Ordnung, aber inlines Fehler innerhalb des Haupt Code Behandlungscode, es ein wenig schwieriger für den Leser so dass die Grundidee des entsprechenden Code zu erhalten.

+0

Das ist in der Tat besser als meine Lösung! Vielen Dank – JNevens

0

Eine Möglichkeit, dies zu lösen, ist die folgende:

MyClass>>addCategory: aCategory toEvent: anEvent 
    | cat | 
    cat := [ anEvent addCategory: aCategory] on: Error do [ :err | Transcript show: err messageText. ^nil. ] 
    Transcript show: 'Category added!'. 
    ^cat 

Diese Lösung wird den Fehler auf den Transcript drucken und nil aus dem Verfahren zurück. Wenn kein Fehler vorliegt, wird der Code fortgesetzt, die Nachricht auf dem Transcript gedruckt und das Objekt zurückgegeben.

Dies ist möglicherweise nicht die beste Lösung, aber es ist eine Möglichkeit, dies zu tun. Solange es Ihnen nichts ausmacht, dass nil im Falle eines Fehlers zurückgegeben wird.