Я собираюсь дать вам самое необычное обсуждение контроля ошибок.
Я встроил очень хороший обработчик ошибок в язык несколько лет назад, и хотя некоторые имена изменились, принципы обработки ошибок сегодня те же. У меня была специальная многозадачная ОС, и мне нужно было восстанавливать ошибки данных на всех уровнях без утечек памяти, роста стека или сбоев. Итак, мое понимание того, как должны работать ошибки и исключения и как они отличаются. Я просто скажу, что у меня нет понимания того, как работает внутренняя структура try catch, поэтому я предполагаю, что до некоторой степени.
Первое, что происходит под прикрытием для обработки ошибок, - это переход из одного состояния программы в другое. Как это сделать? Я доберусь до этого.
Исторически, ошибки старше и проще, а исключения являются более новыми и немного более сложными и способными. Ошибки работают нормально до тех пор, пока вам не понадобится их всплыть, что эквивалентно передаче сложной проблемы вашему руководителю.
Ошибки могут быть числами, такими как номера ошибок, а иногда и с одной или несколькими связанными строками. Например, если произошла ошибка чтения файла, вы можете сообщить, что это такое, и, возможно, из-за ошибки. (Эй, это шаг вперед от простого краха, как в старые времена.)
В отношении исключений часто говорят, что исключения - это объекты, размещенные в стеке особых исключений. Это похоже на стек возврата для потока программы, но он содержит состояние возврата только для попыток и перехватов ошибок. (Раньше я называл их ePush и ePop, и «Abort» был условным броском, который должен был ePop и восстановиться до этого уровня, в то время как «Abort» был полным кубиком или выходом.)
В нижней части стека находится информация о первоначальном вызывающем объекте, объекте, который знает о состоянии, когда была запущена внешняя попытка, что часто происходит при запуске вашей программы. Вдобавок к этому, или следующий слой в стеке, где вверх являются дочерними объектами, а вниз родительскими, является объектом исключения следующего внутреннего блока try / catch.
Если вы делаете попытку внутри попытки, вы укладываете внутреннюю попытку поверх внешней попытки. Если во внутренней попытке возникает ошибка и внутренняя перехватчик не может ее обработать или ошибка передается во внешнюю попытку, управление передается внешнему блоку перехвата (объекту), чтобы посмотреть, сможет ли он обработать ошибку, т.е. ваш руководитель.
Итак, что на самом деле делает этот стек ошибок, так это возможность отмечать и восстанавливать поток программы и состояние системы, другими словами, он позволяет программе не аварийно завершать работу стека возвратов и портить вещи другим (данным), когда дела идут. неправильно. Таким образом, он также сохраняет состояние любых других ресурсов, таких как пулы выделения памяти, и поэтому может очищать их, когда выполняется ловушка. В общем, это может быть очень сложной вещью, и поэтому обработка исключений часто идет медленно. В общем, в эти блоки исключений необходимо включить немного состояния.
Таким образом, блок try / catch устанавливает состояние, в которое можно вернуться, если все остальное испорчено. Это как родитель. Когда наша жизнь испортится, мы можем снова упасть на колени к родителям, и они снова все исправят.
Надеюсь, я вас не разочаровал.