2016-06-21 7 views
3

Vom finally Abschnitt hier: http://docs.julialang.org/en/release-0.4/manual/control-flow/#finally-clauses, verwenden sie dieses Beispiel:Warum blockiert schließlich Fehler?

f = open("file") 
try 
    # operate on file f 
finally 
    close(f) 
end 

Wenn ich einen ähnlichen Code in REPL laufen, dies geschieht:

julia> f = open("myfile.txt") 
IOStream(<file myfile.txt>) 

julia> try 
     sqrt(-10) 
     finally 
     close(f) 
     end 
ERROR: DomainError: 
[inlined code] from none:2 
in anonymous at no file:0 

Jede Idee, was ist der Unterschied?

Antwort

5

finally nicht catch Ausnahmen. Es dient dazu, zu garantieren, dass Bereinigungsschritte unabhängig davon stattfinden, ob eine Ausnahme aufgetreten ist oder nicht. Beachten Sie den Unterschied zwischen:

try 
    sqrt(-10) 
catch 
    println("Exception swallowed!") 
end 

und

try 
    sqrt(-10) 
finally 
    println("This cleanup happened regardless of whether an exception was thrown.") 
end 

Oft kombiniert man catch und finally:

try 
    sqrt(-10) 
catch 
    println("Swallowed exception.") 
finally 
    println("...but finally ran regardless.") 
end 
+0

Warum bekomme ich den Fehler? Ich denke, es ist irreführend, da es so aussieht, als ob es etwas mit der Datei zu tun hat, die geöffnet wurde, aber tatsächlich über sqrt (-1) ist? – 4thSpace

+0

Ja, genau. 'sqrt (-1)' ist ein 'DomainError', weil' sqrt' ein 'Float64' zurückgibt. Der Code würde gut funktionieren, wenn er 'sqrt (-1 + 0im)' wäre. –

1

finally noch getan hat, es ist Aufgabe hier in dem Sinne, dass die close() Betrieb war ausgetragen. Sie können dies in Ihrem Code überprüfen, indem Sie isopen(f) hinzufügen, was false zurückgibt. Sie erhalten jedoch den Fehler, weil Sie versucht haben, etwas zu tun, das es produziert.

0

try Block wird immer vom catch Block gefolgt. in Ihrem Programm vergessen Sie, catch Block vor finally Block zu setzen.

+1

Während dem 'try'-Block normalerweise der' catch'-Block folgt, ist es nicht wahr, dass dies immer der Fall ist. Manchmal, wie in der Dokumentation, soll der Fehler propagiert werden, aber die Datei soll trotzdem geschlossen werden. –