2016-07-15 2 views
4

Я думал, что panic! останавливает все в Rust, но если я panic! в функции обработчика железного маршрута, он не останавливает весь сервер. Вместо этого он просто отображает сообщение о панике.паника! не останавливает сервер Iron

Действительно ли это «нормальное» поведение panic!?

Я не размещаю свой фактический код, потому что я не думаю, что он здесь полезен, но я могу добавить его, если потребуется.

ответ

4

Я думал, panic! останавливает все, что находится в Rust.

Не совсем: panic! только stops¹ ток нить, которая для однопоточных программ останавливает всю программу. Если вы создаете другой поток, родительский поток может определить, был ли в потоке дочернего потока on joining.

Утюг использует много потоков для параллельной обработки нескольких запросов. По-видимому, он просто игнорирует панику в дочерних потоках ...


¹ As DK. и Владимир Матвеев упомянул в комментариях, это не , что простой. Множество вещей может произойти, когда паника «брошена». По умолчанию приложение начинает разматываться (поднимаясь вниз по стеку) до тех пор, пока не будет достигнут «конец» стека или catch_unwind. В первом случае нить убита; в последнем случае пользователь должен решить, что произойдет. Это также possible to configure ваша сборка, так что abort вызывается на panic!.

+0

'panic!' Не обязательно * останавливает * текущую нить. По умолчанию он начинает разматывать, который будет продолжать его * либо * завершает поток *, либо * он разматывается в вызов 'catch_unwind'. В качестве альтернативы он может просто прервать весь процесс. –

+0

Обратите внимание, что можно включить прерывание при панике в последних версиях Rust. –

2

panic! Руст сродни исключений в других языках, с двумя отличиями:

  • вы не можете определить «тип»
  • вы не можете указать «данные»

Это делает неудобно использовать его для передачи сигналов вне диапазона и, следовательно, резервирует его использование для ситуаций «Упс».

В противном случае, он ведет себя примерно так же, как в целом: текущий поток выполнение раскручивается (вызов деструкторов в зависимости от обстоятельств) до одного из 3-х вещей происходит:

  • деструктор panic!: процесс прервется немедленно
  • в нижней части стека достигается: процесс прервется сразу
  • catch_unwind достигается: обработчик решает, что делать

Вдоль пути различные деструкторы могут создавать некоторые многопоточные структуры данных, которые могут вызвать панику при других попытках использования других потоков и т. Д., Но это решение библиотеки и не применяется сам язык.

Примечание: как отмечают другие, в настоящее время существует другое поведение для паники, немедленного аборта. Это избавляет от некоторого кода и, очевидно, предотвращает изящное восстановление.