panic!
Руст сродни исключений в других языках, с двумя отличиями:
- вы не можете определить «тип»
- вы не можете указать «данные»
Это делает неудобно использовать его для передачи сигналов вне диапазона и, следовательно, резервирует его использование для ситуаций «Упс».
В противном случае, он ведет себя примерно так же, как в целом: текущий поток выполнение раскручивается (вызов деструкторов в зависимости от обстоятельств) до одного из 3-х вещей происходит:
- деструктор
panic!
: процесс прервется немедленно
- в нижней части стека достигается: процесс прервется сразу
catch_unwind
достигается: обработчик решает, что делать
Вдоль пути различные деструкторы могут создавать некоторые многопоточные структуры данных, которые могут вызвать панику при других попытках использования других потоков и т. Д., Но это решение библиотеки и не применяется сам язык.
Примечание: как отмечают другие, в настоящее время существует другое поведение для паники, немедленного аборта. Это избавляет от некоторого кода и, очевидно, предотвращает изящное восстановление.
'panic!' Не обязательно * останавливает * текущую нить. По умолчанию он начинает разматывать, который будет продолжать его * либо * завершает поток *, либо * он разматывается в вызов 'catch_unwind'. В качестве альтернативы он может просто прервать весь процесс. –
Обратите внимание, что можно включить прерывание при панике в последних версиях Rust. –