2016-06-21 5 views
3

Из finally раздела здесь: http://docs.julialang.org/en/release-0.4/manual/control-flow/#finally-clauses, они используют этот пример:Почему, наконец, блокируется ошибка?

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

Когда я бегу аналогичный код в РЕПЛ, это происходит:

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 

Любая идея какая разница?

ответ

5

finally не catch исключений. Это гарантирует, что шаги очистки происходят независимо от того, произошло ли исключение или нет. Обратите внимание на разницу между:

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

и

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

Часто один сочетает в себе catch и finally:

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

Так почему я получу ошибку? Я предполагаю, что это вводит в заблуждение, поскольку похоже, что это имеет какое-то отношение к открытому файлу, но на самом деле о sqrt (-1)? – 4thSpace

+0

Да, точно. 'sqrt (-1)' является 'DomainError', потому что' sqrt' возвращает 'Float64'. Код будет работать нормально, если бы это было 'sqrt (-1 + 0im)'. –

1

finally до сих пор сделано это работа здесь в том смысле, что close() операция была выполненный. Вы можете проверить это в своем коде, добавив isopen(f), который возвращает false. Вы получаете ошибку, хотя, потому что пытались сделать что-то, что ее произвело.

0

try За блоком всегда следует блок catch. в вашей программе вы забудете положить блок catch до finally.

+1

В то время как блок 'try' обычно сопровождается блоком' catch', это неверно, что это всегда так. Иногда, как и в документации, вы хотите, чтобы ошибка распространялась ... но файл должен быть закрыт независимо. –

Смежные вопросы