Подтвердить что ты не робот

Требует ли обработка исключений объектно-ориентированное программирование?

В этот момент в моем опыте программирования я понимаю, насколько я испорчен, чтобы иметь обработку исключений, доступную на большинстве языков, используемых сегодня (С++,.Net, Java и т.д.), по крайней мере, по сравнению с C. Я готовлюсь чтобы пройти продвинутый курс C, и я действительно думаю об этих терминах по сравнению с моей нынешней парадигмой.

В C это до программиста, чтобы предотвратить преждевременные ошибки, что довольно сложно для любого, кто используется для обработки исключений. Мне показалось, что любой язык, с которым я столкнулся, имеет обработку исключений, является объектно-ориентированным. Первый объектно-ориентированный язык для обработки исключений, по крайней мере, насколько мне известно, является С++, который является своего рода эволюцией C. (пожалуйста, поправьте меня, если я ошибаюсь)

С учетом сказанного есть что-то о объектно-ориентированном характере языка, который разрешает обработку исключений, или обработка исключений добавлена ​​как функция, поскольку объектно-ориентированные языки действительно начали становиться обычным явлением? Что такое C не хватает, чтобы сказать, С++, в машинный код, который делает работу excpetion?

Я нашел этот пост о том, как обработка исключений работает под капотом, но не уверен, как эта информация относится к моему вопросу (, т.е. не имеет ли уведомлений о C, продолжения и т.д.). Спасибо заранее.

4b9b3361

Ответ 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.