Требует ли обработка исключений объектно-ориентированное программирование?
В этот момент в моем опыте программирования я понимаю, насколько я испорчен, чтобы иметь обработку исключений, доступную на большинстве языков, используемых сегодня (С++,.Net, Java и т.д.), по крайней мере, по сравнению с C. Я готовлюсь чтобы пройти продвинутый курс C, и я действительно думаю об этих терминах по сравнению с моей нынешней парадигмой.
В C это до программиста, чтобы предотвратить преждевременные ошибки, что довольно сложно для любого, кто используется для обработки исключений. Мне показалось, что любой язык, с которым я столкнулся, имеет обработку исключений, является объектно-ориентированным. Первый объектно-ориентированный язык для обработки исключений, по крайней мере, насколько мне известно, является С++, который является своего рода эволюцией C. (пожалуйста, поправьте меня, если я ошибаюсь)
С учетом сказанного есть что-то о объектно-ориентированном характере языка, который разрешает обработку исключений, или обработка исключений добавлена как функция, поскольку объектно-ориентированные языки действительно начали становиться обычным явлением? Что такое C не хватает, чтобы сказать, С++, в машинный код, который делает работу excpetion?
Я нашел этот пост о том, как обработка исключений работает под капотом, но не уверен, как эта информация относится к моему вопросу (, т.е. не имеет ли уведомлений о C, продолжения и т.д.). Спасибо заранее.
Ответы
Ответ 1
C ничего не имеет в машинных кодах, и обработка исключений была и является обычным явлением в C с setjmp
и longjmp
.
Причиной полного отсутствия языковой функции на чисто процедурных языках является то, что обработка исключений идентична setjmp
, когда не нужно вызывать деструкторов. Обработка исключений была раньше, чем на экзотических языках, но никогда не попадалась, потому что это был чисто синтаксический сахар. Однако после того, как деструкторы вошли в сцену, и необходимость в восстановлении стека стала необходимой, поддержка уровня языка стала необходимой, и обработка исключений была широко реализована как часть языка.
Ответ 2
Требуется ли обработка исключений объектно-ориентированное программирование?
Нет. Эти два полностью разделены. Можно иметь языки OO, которые не имеют обработки исключений в качестве примитива потока управления, и можно иметь обработку исключений на языках, отличных от OO.
Объектно-ориентированное программирование, как убедительно указывает Википедия, - это стиль программирования, который подчеркивает значение абстракции, инкапсуляции, сообщений, модульность, полиморфизм и наследование, чтобы обеспечить недорогое повторное использование кода и эффективное управление сложными проектами программного обеспечения, осуществляемыми крупными командами.
Вы не видите в этом списке "циклы" или "if statements" или "goto" или "try-catch-finally-throw", потому что примитивы управления потоком не имеют ничего общего с абстракции, инкапсуляции, обмена сообщениями, модульности, полиморфизма или наследования, используемых для обеспечения повторного использования с низкой стоимостью кода или эффективного управления сложными проектами программного обеспечения крупными командами.
Что такое C не хватает, чтобы сказать, С++, в машинный код, делающий исключения?
Конечно, современное оборудование разработано с учетом обработки исключений в качестве примитива потока управления. C был разработан задолго до того, как существовало современное оборудование, что сделало бы несколько сложнее реализовать обработку исключений в C, которая эффективно работает на всем оборудовании, на котором работает C.
Но это говорит, что ничто не мешает вам или кому-либо еще разрабатывать новую версию C, которая имеет обработку исключений в качестве примитива потока управления, но без всех других функций С++.
Если вас интересует вопрос о том, как добавить обработку исключений на языки, отличные от OO, которые поддерживают продолжение, см. мою статью по этому вопросу, в которой излагается идея:
http://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-part-two-handwaving-about-control-flow.aspx
Ответ 3
С учетом сказанного есть что-то о объектно-ориентированном характере языка, который разрешает обработку исключений, или обрабатывается исключение как функция, поскольку объектно-ориентированные языки действительно стали обычным явлением?
Я впервые узнал об исключениях, когда мне пришлось учиться Аде (учиться в CS) в начале 90-х годов. IIRC, Ada имел особый тип Exception
. Тогда это был не объектно-ориентированный язык. (Ada95 добавил некоторые концепции OO.) Однако я согласен, что разворот стека (т.е. Полная автоматическая очистка выделенных ресурсов) является важной чертой успеха обработки исключений. Объединение деструкторов с обработкой исключений - важный момент для успеха исключений в С++.
Я также помню, как Страуструп упоминал Ada как важное влияние на обработку исключений на С++.
Ответ 4
Требуется ли обработка исключений объектно-ориентированное программирование?
Нет. Эти два ортогональны. Другие упомянули setjmp
и longjmp
, используемые в C для обработки ошибок. Я хочу упомянуть SEH.
SEH (структурированная обработка исключений) - это расширение Microsoft для C с поддержкой уровня ОС. Он позволяет писать код типа (пример из MSDN):
__try
{
*pResult = dividend / divisor;
}
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// handle exception
}
Вы также можете вызвать свои собственные исключения, вызвав RaiseException
. В отличие от setjmp
и longjmp
вы можете сделать свою собственную очистку в блоках __finally
. На самом деле исключения С++ реализованы поверх SEH (на окнах).
Это пример обработки исключений в полностью объектном неориентированном виде.
Другой пример в С++, который не использует объектно-ориентированные функции:
try {
throw "Boom!";
} catch(const char* str) {
printf("Error: %s\n", str);
}
Ответ 5
Необъектно-ориентированные языки, реализующие обработку исключений, включают в себя:
- ITS TECO
- PL/1 (Multics)
- C (как указывалось несколькими людьми, через
setjmp
/longjmp
)
- C посредством сигналов Unix: сигналы ядра Unix получены из средства обработки исключений Multics
- более старые версии Lisp (предоставлено, Common Lisp разрешает ООП, но это не было, когда были добавлены условия и перезагрузки), которые, по-видимому, реализовали условия и перезапустили (
unwind-protect
s) от ITS TECO - согласно RMS (http://www.gsim.aoyama.ac.jp/~ida/GNU/RMStalk1207.html), подразумевая, что Lisp фактически унаследовал обработку исключений посредством Emacs (nifty!)
Ответ 6
Для необязательного примера попробуйте использовать Haskell для размера. Исключения даже не нужно встраивать в язык; theyre просто часть возвращаемого типа (например, Either MyException MyValue
или ExceptionalT IOException IO String
). Стандартные исключения можно обрабатывать с помощью функции try
из модуля Control.Exception
:
main = do
result <- try (evaluate (1 `div` 0))
case result of
Left exception -> putStrLn $ "Caught: " ++ show exception
Right value -> putStrLn $ "Result: " ++ show value
Вы также можете использовать функцию как обработчик исключений с помощью функции catch
, здесь используется infix:
main = (print $ 1 `div` 0) `catch` \exception ->
putStrLn $ "Caught: " ++ show exception
И вы можете использовать монадию Exception для выполнения операций исключения исключений в другой монаде. Управляя всеми возможными исключениями, вы избегаете монады Exception.
main =
do result <- runExceptionalT someFunction
case result of
Exception exception -> putStrLn ("Caught: " ++ show exception)
Success value -> putStrLn ("Result: " ++ show value)
Поскольку исключение является частью сигнатуры типа функций, оно должно быть явно учтено. Это по сути то же самое, что и проверенные исключения в Java.
Ответ 7
Ну, исключения встречаются на языке ассемблера, где вы можете использовать ловушки (принудительное исключение) и другие исключения для управления потоком программы. Примером может быть nullpointer или почему не stackoverflow. Ничто не говорит о природе OO-языков, которые позволяют обрабатывать исключения. Они просто упрощают (и языки высокого уровня имеют тенденцию бросать намного больше исключений). Исключения являются ключевой особенностью базового программирования. И этим я не имею в виду все программирование, я имею в виду "регулярное" программирование, включая сборку. Я не понимаю, что вы имеете в виду, когда говорите: "Чего не хватает C, чтобы сказать, С++, в машинный код, делающий исключения?". И я бы не сказал, что программист наверняка поймает исключения в C (но я новичок в этой области. Если кто-то может исправить меня, пожалуйста).
Ответ 8
Обработка исключений существует довольно долго, задолго до С++. На нескольких "бутиковых" языках обработка исключений была довольно ранней, но Ada (конец 70-х, IIRC), вероятно, была самой известной. У Ады были мерцания OO-ness, но он не был OO по современным стандартам.
Обработка исключений также реализована в нескольких версиях языков PL/S (определенно не OO), которые в основном использовались внутри IBM. Ранние реализации (начиная с конца 70-х годов) были разработаны с использованием макросов (макропроцессор PS/S превосходил большинство из них), но более поздние версии встроили EH в язык.
Ответ 9
Языки без OO также имеют исключения, это полезная абстракция для разворачивания стека вызовов. Примеры Erlang и Forth.