- PVSM.RU - https://www.pvsm.ru -

В Rust 1.0 исключений не будет

Rust LogoСегодня Аарон Тюрон — разработчик, недавно присоединившийся к разработке Rust в Mozilla — объявил [1] об отсрочке реализации какого-либо механизма исключений, кроме уже существующего макроса try! и типа Result, до неопределённого момента после первого релиза языка программирования Rust.

Это означает, что в Rust 1.0 будут отсутствовать исключения первого класса — то есть, полностью интегрированные с другими фичами языка.

Для обработки ошибок в данной момент в Rust существует тип Result { Ok(value), Err(why) } и макрос try!. Тип Result представляет из себя перечисление (enum), похожее на Option { Some(value), None } и связанное с ним по смыслу. Вариант None типа Option говорит об отстутствии значения, а вариант Err(why) типа Result уточняет, почему значение отсутствует.

Rust предлагает возвращать тип Result из функций, чтобы передавать значение возврата или причину, по которой значение вернуть не удалось. Макрос try! в свою очередь позволяет автоматически возвращать Err(why) из текущей функции, если вызов другой функции не удался (применяется к объекту типа Result).

Вот так это выглядит в коде:

enum MathError {
    DivisionByZero
}

// функция, не всегда завершающаяся успешно
fn div(x: f64, y: f64) -> Result<f64, MathError> {
    if y == 0.0 {
        Err(DivisionByZero) // возвращаем ошибку
    } else {
        Ok(x / y)
    }
}

// пример ручного раскрытия Result
fn div_user() -> () {
    match div(1.0, 0.0) {
        Err(why) => /* обработки ошибки, why имеет тип MathError */
        Ok(result) => /* успешный результат в переменной result типа f64 */
    }
}

// пример автоматического возврата ошибок из функции
fn error_proxy() -> Result<f64, MathError> {
    let result1 = try!(div(1.0, 0.0));
    let result2 = try!(div(1.0, result1));
    div(1, result2);
}

На этом возможности Rust в плане обработке ошибок, по-сути, заканчиваются. Наоборот, начинаются проблемы, когда тип возвращаемых ошибок вызываемой функции не совпадает с типом ошибок вызывающей функции.

Узнать больше о Rust можно на официальном сайте [2], а посмотреть примеры кода с разбором можно, например, на rustbyexample.com [3]: Option [4], Result [5], try! [6].

Rust — низкоуровневый язык программирования с мощной системой статического анализа. Например, статический анализ в Rust не допускает неосторожную работу с памятью. Язык разрабатывается некоммерческой организацией Mozilla, а релиз Rust 1.0 намечен на начало 2015 года.

Автор: a553

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/73496

Ссылки в тексте:

[1] объявил: https://github.com/rust-lang/rfcs/pull/243#issuecomment-61559683

[2] официальном сайте: http://www.rust-lang.org/

[3] rustbyexample.com: http://rustbyexample.com

[4] Option: http://rustbyexample.com/option.html

[5] Result: http://rustbyexample.com/result.html

[6] try!: http://rustbyexample.com/result/try.html

[7] Источник: http://habrahabr.ru/post/242269/