Estritamente falando, não é sintático. Python não pode saber se obterá uma classe ou instância até o tempo de execução.
asmeurer em
Respostas:
114
A resposta curta é que ambos raise MyException e raise MyException()fazem a mesma coisa. Este primeiro formulário cria uma instância automática de sua exceção.
A seção relevante dos documentos diz: " raise avalia a primeira expressão como o objeto de exceção. Deve ser uma subclasse ou uma instância de BaseException. Se for uma classe, a instância de exceção será obtida quando necessário instanciando a classe com sem argumentos. "
Dito isso, embora a semântica seja a mesma, a primeira forma é microscopicamente mais rápida e a segunda forma é mais flexível (porque você pode passar argumentos, se necessário).
O estilo usual que a maioria das pessoas usa em Python (ou seja, na biblioteca padrão, em aplicativos populares e em muitos livros) é raise MyExceptionquando não há argumentos. As pessoas apenas instanciam a exceção diretamente quando alguns argumentos precisam ser passados. Por exemplo: raise KeyError(badkey).
É importante notar que a sintaxe deraise mudou um pouco no Python 3. A parte que é relevante para esta questão é a mesma ( raise ExceptionTypeainda cria uma instância do tipo chamando seu construtor sem argumentos).
Blckknght
0
Sim, há uma diferença entre ValueErroreValueError()
ValueErroré uma classe enquanto ValueError()cria uma instância de uma classe. Esta é a razão pela qual type(ValueError) is typeetype(ValueError()) is ValueError
O único objetivo de raiseé levantar a exceção,
quando usarmos ValueError, a classe será chamada, que por sua vez executa o construtor ValueError()
quando usamos ValueError(), o método ValueError()é chamado diretamente.
Nota: raise ValueError # shorthand for 'raise ValueError()'
Respostas:
A resposta curta é que ambos
raise MyException
eraise MyException()
fazem a mesma coisa. Este primeiro formulário cria uma instância automática de sua exceção.A seção relevante dos documentos diz: " raise avalia a primeira expressão como o objeto de exceção. Deve ser uma subclasse ou uma instância de BaseException. Se for uma classe, a instância de exceção será obtida quando necessário instanciando a classe com sem argumentos. "
Dito isso, embora a semântica seja a mesma, a primeira forma é microscopicamente mais rápida e a segunda forma é mais flexível (porque você pode passar argumentos, se necessário).
O estilo usual que a maioria das pessoas usa em Python (ou seja, na biblioteca padrão, em aplicativos populares e em muitos livros) é
raise MyException
quando não há argumentos. As pessoas apenas instanciam a exceção diretamente quando alguns argumentos precisam ser passados. Por exemplo:raise KeyError(badkey)
.fonte
Vá dar uma olhada na documentação da
raise
declaração . Ele está criando uma instância deMyException
.fonte
raise
mudou um pouco no Python 3. A parte que é relevante para esta questão é a mesma (raise ExceptionType
ainda cria uma instância do tipo chamando seu construtor sem argumentos).Sim, há uma diferença entre
ValueError
eValueError()
ValueError
é uma classe enquantoValueError()
cria uma instância de uma classe. Esta é a razão pela qualtype(ValueError) is type
etype(ValueError()) is ValueError
O único objetivo de
raise
é levantar a exceção,Nota:
raise ValueError # shorthand for 'raise ValueError()'
fonte