Сегодня Аарон Тюрон — разработчик, недавно присоединившийся к разработке Rust в Mozilla — объявил об отсрочке реализации какого-либо механизма исключений, кроме уже существующего макроса
Это означает, что в Rust 1.0 будут отсутствовать исключения первого класса — то есть, полностью интегрированные с другими фичами языка.
Для обработки ошибок в данной момент в Rust существует тип
Rust предлагает возвращать тип
Вот так это выглядит в коде:
На этом возможности Rust в плане обработке ошибок, по-сути, заканчиваются.
Rust — низкоуровневый язык программирования с мощной системой статического анализа. Например, статический анализ в Rust не допускает неосторожную работу с памятью. Узнать больше о Rust можно на официальном сайте, а посмотреть примеры кода с разбором можно, например, на rustbyexample.com: Option, Result, try!. Язык разрабатывается некоммерческой организацией Mozilla, а релиз Rust 1.0 намечен на начало 2015 года.
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 — низкоуровневый язык программирования с мощной системой статического анализа. Например, статический анализ в Rust не допускает неосторожную работу с памятью. Узнать больше о Rust можно на официальном сайте, а посмотреть примеры кода с разбором можно, например, на rustbyexample.com: Option, Result, try!. Язык разрабатывается некоммерческой организацией Mozilla, а релиз Rust 1.0 намечен на начало 2015 года.