programing

예외 처리에는 객체 지향 프로그래밍이 필요합니까?

linuxpc 2023. 9. 8. 21:13
반응형

예외 처리에는 객체 지향 프로그래밍이 필요합니까?

제 프로그래밍 경험의 이 시점에서, 저는 적어도 C와 비교할 때, 오늘날 사용되는 대부분의 언어(C++, .Net, Java 등)에서 예외 처리를 사용할 수 있게 된 것이 제가 얼마나 버릇이 없는지를 깨달았습니다.저는 고급 C 과정을 수강할 준비를 하고 있으며, 현재의 패러다임과 비교하여 그러한 용어들을 정말로 생각하게 합니다.

C에서는 오류가 발생하지 않도록 하는 것이 프로그래머의 몫인데, 이는 예외 처리에 익숙한 모든 사람들에게는 상당히 부담스러운 일입니다.예외적으로 취급하는 언어는 모두 객체 지향적이라는 생각이 들었습니다.적어도 내가 아는 한, 예외 처리를 가진 첫 번째 객체 지향 언어는 C의 진화인 C++입니다. (만약 내가 틀리면 고쳐주세요.)

그렇다면 예외 처리를 허용하는 언어의 객체 지향적 특성에 대한 무언가가 있는 것일까요, 아니면 객체 지향 언어가 정말 일상화되기 시작하면서 예외 처리가 특징으로 추가된 것일까요? C가 예외를 작동시키는 기계 코드에서 C++라고 말하기에는 무엇이 부족합니까?

나는 후드 아래에서 예외 처리가 어떻게 작동하는지에 대한 이 게시물을 찾았지만, 그 정보가 내 질문에 어떻게 적용되는지 확실하지 않습니다(즉, C에 알림, 계속 등이 있습니까?).미리 감사드립니다.

, C 에서 도 하지 는 이고 입니다 는 이고 입니다 는 에서 setjmp그리고.longjmp.

가 한 의 이 는 가 입니다 과 에서 입니다 과 가 한 setjmp파괴자를 부를 필요가 없을 때.이국적인 언어에서 예외 처리는 이전에도 있었지만, 그것은 순전히 통사적인 설탕이었기 때문에 결코 인기를 끌지 못했습니다.그러나 디스트럭터가 현장에 진입하고 스택 언와인딩이 필요하게 되자 언어 수준의 지원이 필요하게 되었고 예외 처리가 언어의 일부로 널리 구현되었습니다.

예외 처리에는 객체 지향 프로그래밍이 필요합니까?

아뇨, 둘은 완전히 별개에요제어 흐름 프리미티브로 예외 처리가 없는 OO 언어를 사용할 수 있고, OO 언어가 아닌 경우 예외 처리를 사용할 수 있습니다.

위키피디아가 유용하게 지적한 바와 같이 객체지향 프로그래밍은 대규모 팀에서 구현하는 복잡한 소프트웨어 프로젝트의 저비용 코드 재사용과 효과적인 관리를 달성하기 위해 추상화, 캡슐화, 메시징, 모듈화, 다형성, 상속가치를 강조하는 프로그래밍 스타일입니다.

제어 흐름 프리미티브는 추상화, 캡슐화, 메시징, 모듈화, 다형성 또는 상속이 대규모 팀의 복잡한 소프트웨어 프로젝트를 효과적으로 관리하는 데 사용되는 것과 전혀 무관하기 때문에 해당 목록에는 "loops", "if문", "goto" 또는 "try-catch-finally-throw"가 표시되지 않습니다.

C가 예외를 작동시키는 기계 코드에서 C++라고 말하기에는 무엇이 부족합니까?

현대 하드웨어는 제어 흐름 원시를 염두에 두고 예외 처리를 설계한 것이 확실합니다.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

그렇다면 예외 처리를 허용하는 언어의 객체 지향적 특성에 대한 무언가가 있는 것일까요, 아니면 객체 지향 언어가 정말 일상화되기 시작하면서 예외 처리가 특징으로 추가된 것일까요?

저는 90년대 초반에 에이다(CS 공부)를 배워야 했을 때 예외를 처음 알게 되었습니다.IIRC, 에이다는 특별한 유형을 가지고 있었습니다.Exception그언어가 . 그 당시에는 사물 지향적인 언어가 아니었습니다.(Ada95는 몇 가지 OO 개념을 추가했습니다.그러나 스택 해제(즉, 할당된 리소스의 완전 자동 정리)가 예외 처리의 성공에 중요한 특성이라는 데 동의합니다.예외 처리에 디스트레이터를 결합하는 것은 C++에서 예외 처리의 성공을 위한 중요한 포인트입니다.

Stroustrup이 C++에서 예외 처리의 주요한 영향으로 Ada를 언급한 것도 기억하고 있는 것 같습니다.

예외 처리에는 객체 지향 프로그래밍이 필요합니까?

아뇨, 둘은 직교합니다다른 사람들은 언급했습니다.setjmp그리고.longjmp오류를 처리하기 위해 C에서 사용됩니다.SEH에 대해서 말씀드리겠습니다.

SEH(Structured exception handling)는 운영 체제 수준을 지원하는 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토막토막실제로 C++ 예외는 SEH 위에 구현됩니다.

이것은 완전 개체 지향적이지 않은 방식으로 예외를 처리하는 예입니다.

객체 지향 기능을 사용하지 않는 C++의 또 다른 예는 다음과 같습니다.

try {
    throw "Boom!";
} catch(const char* str) {
    printf("Error: %s\n", str);
}

예외 처리를 구현하는 비객체 지향 언어는 다음과 같습니다.

  • ITS TECO
  • PL/1(멀티틱스)
  • C (여러 사람들이 지적한 바와 같이,setjmp/longjmp)
  • C 유닉스 신호 방식:Unix 커널 신호는 Multics 예외 처리 기능에서 파생됩니다.
  • 이전 버전의 리스프(Common Lisp는 OOP를 허용하지만, 조건과 재시작이 추가되었을 때는 허용되지 않았습니다.)는 조건과 재시작을 구현한 것으로 보입니다.unwind-protects) ITS TECO에서—RMS(http://www.gsim.aoyama.ac.jp/ ~ida/GNU/RMStalk1207.html)에 따르면, 실제로 리스프가 Emacs를 통해 예외 처리를 물려받았음을 암시합니다(불확실성!).

비필수 예제의 경우 크기에 대해 Haskellon을 사용해 보십시오.예외는 언어에 포함될 필요도 없습니다. 반환 유형의 일부일 뿐입니다(예: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서 fixfunction,서 fix:

main = (print $ 1 `div` 0) `catch` \exception ->
  putStrLn $ "Caught: " ++ show exception

그리고 Exception monad를 사용하여 다른 monad에서 Exception throwing 작업을 수행할 수 있습니다.가능한 모든 예외를 처리하면 예외 모나드에서 탈출합니다.

main =
   do result <- runExceptionalT someFunction
      case result of
         Exception exception -> putStrLn ("Caught: " ++ show exception)
         Success   value     -> putStrLn ("Result: " ++ show value)

예외는 함수의 형식 서명의 일부를 구성하므로 명시적으로 설명해야 합니다.이는 Java에서 확인된 예외 사항과 본질적으로 동일합니다.

예외 처리는 C++보다 훨씬 이전부터 상당히 오래 전부터 있어 왔습니다.여러 부티크(boutique) 언어들은 예외 처리를 상당히 일찍 구현했지만, 아마 에이다(70년대 후반 IIRC)가 가장 잘 알려져 있을 것입니다.Ada는 OO성의 반짝임을 가지고 있었지만, 현대적인 기준으로는 OOO가 아니었습니다.

예외 처리는 IBM 내부에서 주로 사용되는 PL/S 언어의 여러 버전(확실히 OO는 아님)에서도 구현되었습니다.(70년대 후반으로 거슬러 올라가는) 초기 구현들은 매크로를 사용하여 개발되었습니다 (PS/S 매크로 프로세서는 그 이후 대부분의 매크로 프로세서보다 우수했습니다), 그러나 이후 버전들은 EH를 언어에 포함시켰습니다.

OOO 이외의 언어에도 예외가 있으므로 콜 스택을 푸는 데 유용한 추상화입니다.예를 들면 Erlang과 Forth가 있습니다.

여기서는 트랩(강제 예외) 및 기타 예외를 사용하여 프로그램의 흐름을 제어할 수 있는 어셈블리 언어에서 예외를 찾을 수 있습니다.예를 들어 널 포인터 또는 스택 오버플로가 되지 않는 이유를 들 수 있습니다.OOO 언어의 특성상 예외 처리가 가능한 것은 없습니다.고급 언어는 훨씬 더 많은 예외를 적용하는 경향이 있습니다.예외는 기본 프로그래밍의 핵심 기능입니다.모든 프로그래밍을 의미하는 것이 아니라 조립을 포함한 "정규적인" 프로그래밍을 의미합니다."C가 예외를 작동시키는 기계 코드에서 C++라고 말하는 것이 무엇입니까?"라고 말하는 것이 무슨 뜻인지 이해가 되지 않습니다.그리고 C에서 예외를 잡는 것이 완전히 프로그래머의 몫이라고 말하지는 않을 것입니다(하지만 저는 이 분야의 초보자입니다).누가 고쳐줄 수 있다면 해주세요).

언급URL : https://stackoverflow.com/questions/8579836/does-exception-handling-require-object-oriented-programming

반응형