programing

Python: __init__ 내에서 예외를 제기하는 것은 나쁜 형식입니까?

lastmoon 2023. 6. 6. 10:35
반응형

Python: __init__ 내에서 예외를 제기하는 것은 나쁜 형식입니까?

내에서 예외를 제기하는 것이 잘못된 형식으로 간주됩니까?__init__그렇다면, 특정 클래스 변수가 다음과 같이 초기화될 때 오류를 던지는 허용되는 방법은 무엇입니까?None또는 잘못된 유형의 것입니까?

내에서 예외 발생__init__()절대적으로 괜찮습니다.이니셜라이저 내에서 오류 상태를 나타내는 다른 좋은 방법은 없으며, 표준 라이브러리에는 개체를 초기화할 때 예외가 발생할 수 있는 수백 개의 예가 있습니다.

제기할 오류 등급은 물론 여러분에게 달려 있습니다. ValueError이니셜라이저가 잘못된 매개 변수를 전달한 경우가 가장 좋습니다.

생성자의 오류를 나타내는 유일한 적절한 방법은 예외를 제기하는 것입니다.그렇기 때문에 C++ 및 예외 안전을 염두에 두고 설계된 다른 객체 지향 언어에서는 객체의 생성자에 예외가 던져지면 소멸자가 호출되지 않습니다(오브젝트의 초기화가 불완전하다는 의미).이것은 종종 Python과 같은 스크립트 언어에서는 그렇지 않습니다.예를 들어 socket.connect()가 실패할 경우 다음 코드가 AttributeError를 발생시킵니다.

class NetworkInterface:
    def __init__(self, address)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(address)
        self.stream = self.socket.makefile()

    def __del__(self)
        self.stream.close()
        self.socket.close()

연결 시도가 실패한 후 스트림 특성이 초기화되기 전에 불완전한 개체의 소멸자가 호출되기 때문입니다.생성자의 예외를 회피해서는 안 됩니다. 파이썬에서 완전한 예외 안전 코드를 작성하는 것은 어렵다는 것입니다.일부 Python 개발자들은 디스트럭터 사용을 완전히 피하지만, 그것은 다른 논쟁의 문제입니다.

나는 그것이 나쁜 형태가 되어야 할 이유가 없다고 생각합니다.

반대로 오류 코드를 반환하는 것과는 달리 오류 코드는 일반적으로 생성자에 의해 반환될 수 없다는 것이 잘 알려진 예외 중 하나입니다.따라서 적어도 C++와 같은 언어에서는 예외를 높이는 것이 오류를 신호로 보낼 수 있는 유일한 방법입니다.

표준 라이브러리는 다음과 같이 말합니다.

>>> f = file("notexisting.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'notexisting.txt'

또한 저는 그것이 나쁜 형태로 여겨져야 할 이유가 전혀 없다고 생각합니다.

빌트인을 위한 완벽한 케이스라고 생각합니다.ValueError예외.

경우에 따라 init에서 오류를 발생시키는 것은 피할 수 없지만 init에서 너무 많은 작업을 하는 것은 나쁜 스타일입니다.설정된 개체를 반환하는 간단한 클래스 방법인 공장 또는 유사 공장을 만드는 것을 고려해야 합니다.

저는 위의 모든 것에 동의합니다.

예외를 제기하는 것 외에는 객체의 초기화에서 뭔가 잘못되었다는 신호를 보내는 방법이 없습니다.

클래스의 상태가 해당 클래스에 대한 입력에 전적으로 의존하는 대부분의 프로그램 클래스에서 일종의 ValueError 또는 TypeError가 발생할 것으로 예상할 수 있습니다.

네트워크 장치를 사용할 수 없거나 캔버스 개체를 쓸 수 없는 경우 부작용이 있는 클래스(예: 네트워킹 또는 그래픽을 수행하는 클래스)가 init에 오류를 발생시킬 수 있습니다.고장 조건에 대해 가능한 한 빨리 알고 싶어하는 경우가 많기 때문에 이는 합리적인 것으로 생각됩니다.

언급URL : https://stackoverflow.com/questions/1507082/python-is-it-bad-form-to-raise-exceptions-within-init

반응형