julia: отобразить ошибку `catch` в потоке управления - PullRequest
0 голосов
/ 07 июня 2019

Рассмотрим следующее try / catch flow

function test(x)
    try x^3
        if x < 0; error("i only accept x >= 0"); end
        return x^3
    catch
        return abs(x)^3
    end
end

Как отобразить сообщение об ошибке (и трассировку стека) в случае test(-2) # == 8?В этом случае я знаю ошибку, но если это более сложная функция с утверждениями и т. Д., Я хотел бы знать, что конкретно не удалось.

Попытка rethrow() должна быть выполнена в блоке try-catch,но я все еще хочу возвращаемое значение.

1 Ответ

1 голос
/ 07 июня 2019

Вы можете сохранить Exception в переменной после записи имени переменной по вашему выбору сразу после catch. error создает ErrorException. Вы можете увидеть поля этого Exception, используя fieldnames(ErrorException). Поле msg содержит сообщение, которое вы передали error. В качестве альтернативы вы можете использовать метод showerror.

function test(x)
    try x^3
        if x < 0; error("i only accept x >= 0"); end
        return x^3
    catch e
        showerror(stdout, e)
        # or 
        println(e.msg)
    end
end

Для трассировки стека вы можете использовать stacktrace(catch_backtrace()). Мы передаем catch_backtrace в stacktrace, потому что обычно мы хотим получить трассировку стека контекста самого последнего исключения, а не текущего контекста.

...