Макрос unreachable!
Макрос unreachable! используется для обозначения кода,
который по логике программы никогда не должен выполниться.
Если во время выполнения программы управление всё же доходит
до этого места, макрос вызывает панику с сообщением
"internal error: entered unreachable code".
Макрос может принимать необязательное сообщение, которое
будет выведено при панике, а также поддерживает форматирование
через {} и другие спецификаторы, как println!.
Макрос unreachable! помогает документировать
предположения о потоке управления и делает код более
понятным. Компилятор также может использовать эту
информацию для оптимизаций.
Синтаксис
unreachable!()
unreachable!("сообщение")
unreachable!("сообщение {}", переменная)
Пример
Давайте рассмотрим простой пример, где мы точно знаем,
что ветка _ в match никогда не выполнится:
fn main()
{
let res = check(5);
println!("{}", res);
}
fn check(x: i32) -> &'static str
{
match x
{
1 => "one",
2 => "two",
3 => "three",
_ => unreachable!(),
}
}
Результат выполнения кода:
"three"
Пример
Давайте посмотрим, что произойдёт, если код всё же
достигнет вызова unreachable! с пользовательским
сообщением:
fn main()
{
let x = 10;
if x > 5
{
println!("x is greater than 5");
}
else
{
unreachable!("this branch should never run");
}
}
Результат выполнения кода:
x is greater than 5
Пример
Давайте вызовем unreachable! напрямую,
чтобы увидеть панику и сообщение:
fn main()
{
unreachable!("this code should never run");
}
Результат выполнения кода:
thread 'main' panicked at 'this code should never run'
Смотрите также
-
макрос
todo!,
который обозначает ещё не реализованный код -
макрос
unimplemented!,
который обозначает нереализованную функциональность -
макрос
panic!,
который вызывает панику с сообщением -
метод
unwrap,
который извлекает значение из Option или Result