3장 예외 및 오류 처리 완료, 발췌
생성자와 예외
이 주제는 C++ 커뮤니티에서 자주 언급되는 주제인데, 델파이 커뮤니티에서는 누구도 이 주제에 관심을 두지 않은 것 같습니다. 아마도 언어의 특성상 델파이 프로그래머들은 이 문제에 대해 걱정할 필요가 없을 것입니다. 하지만 저는 델파이 프로그래머들도 이 문제를 이해하고 우리가 이 문제를 쉽게 무시할 수 있도록 언어가 무엇을 제공하는지 알아야 한다고 생각합니다. "축복에 둘러싸여 있으면 축복도 알아야 한다"는 말이 있습니다. 클래스의 생성자에는 반환 값이 없다는 것을 알고 있습니다. 생성자가 객체 생성에 실패하면 오류 코드 반환에 의존할 수 없습니다. 그렇다면 프로그램에서 생성자의 오류를 식별하는 방법은 무엇입니까? 가장 "표준적인" 방법은 예외를 발생시키는 것입니다. 생성자의 실패는 객체 생성이 실패한다는 것을 의미합니다. 따라서 예외가 발생한 후 이 "반쯤 죽은" 객체는 어떻게 처리됩니까? 여기서는 읽기에 앞서 C++에서 이러한 상황을 어떻게 처리하는지에 대한 이해가 필요하다고 생각합니다. C++에서는 생성자가 예외를 발생한 후에 소멸자가 호출되지 않습니다. 이 접근 방식은 현재 개체가 완전히 구성되지 않았기 때문에 합리적입니다. 생성자가 메모리 할당, 파일 열기 등과 같은 일부 작업을 수행한 경우 C++ 클래스에는 수행된 작업을 기억하기 위한 자체 멤버가 있어야 합니다. 물론 이는 클래스 구현자에게 매우 번거로운 일이므로 일반적으로 C++ 클래스 구현자는 생성자에서 예외를 발생시키지 않습니다(생성자나 클래스 클라이언트에 맡겨진 Init 및 UnInit와 같은 멤버 함수를 제공할 수 있음). 초기화 실패). 모든 클래식 C++ 책에서 제공하는 솔루션은 스마트 포인터(STL의 표준 클래스 auto_ptr)를 사용하는 것입니다. 오브젝트 파스칼에서는 이 문제가 매우 간단해지며 프로그래머는 이에 대해 걱정할 필요가 없습니다. 오브젝트 파스칼 클래스가 생성자에서 예외를 발생시키는 경우 컴파일러는 자동으로 클래스의 소멸자를 호출합니다. (소멸자는 오버로드가 허용되지 않으므로 소멸자는 하나만 존재하므로 컴파일러가 혼동하지 않습니다. . 여러 소멸자 중). 멤버 객체는 일반적으로 소멸자에서 소멸되는데, Free() 메서드는 nil 객체(즉, 아직 생성되지 않은 멤버 객체)에 대해서는 소멸자가 호출되지 않도록 보장하므로 코드를 간결하고 아름답게 만듭니다. 그것은 또한 안전을 보장합니다. type MyClass = classPRivateFStr : PChar; // 문자열 포인터 publicconstructor Create();destructor Destroy(); override;end;constructor MyClass.Create();beginFStr := StrAlloc(10); // 생성자 내 문자열 포인터 Allocate memoryStrCopy( FStr, 'ABCDEFGHI'); Exception.Create('error') // 발생 예외 발생, 이유 없음, hahaend;destructor A.Destroy();beginStrDispose(FStr); // 소멸자에서 메모리 해제 WriteLn('Free Resource');end;varObj : TMyClass;i : 정수;begintryObj : = TMyClass.Create ();Obj.Free();WriteLn('성공'); ExceptObj := nil;WriteLn('Failed');end;Read(i); // 실행 결과를 관찰하기 위해 화면을 일시 중지합니다. 이 코드에서는 생성자가 예외를 발생시키고 실행 결과는 다음과 같습니다. Free Resource" 출력은 컴파일러가 자동으로 소멸자를 호출하여 생성됩니다. 따라서 클래스 문서나 클래스 작성자가 클래스 생성자가 예외를 throw할 수 있다고 말하는 경우 이를 try...Exception으로 래핑하는 것을 기억하세요! C++와 오브젝트 파스칼이 생성자에 의해 발생한 예외를 처리하는 다양한 방식은 실제로 두 언어의 디자인 아이디어를 구체화한 것입니다. C++는 C의 스타일을 고수하며 효율성에 중점을 둡니다. 모든 것은 프로그래머에게 맡겨져 있으며 컴파일러는 불필요한 작업을 수행하지 않습니다. 오브젝트 파스칼은 파스칼의 스타일을 계승하고 프로그램의 미학적 의미에 중점을 둡니다. 컴파일러는 프로그래머가 복잡한 작업을 완료하는 데 도움을 줍니다.