2017-05-22 4 views
1

현재 Mark Lutz와 David Ascher가 Learning Python을 통해 작업 중이며 오류를 발생시키는 코드 섹션을 발견했습니다. 나는이 책이 Python 3과는 달리 Python 2로 작성되었다는 것을 알고있다. 사방에 쳐다 보면서 누군가가 내 문제에 대한 해결책을 알고 있는지 궁금 해서요. 그러나 해결책을 찾지 못했습니다.Python 3 - raise 문

......................... 기본적으로

MyBad = 'oops' 

def stuff(): 
    raise MyBad 

try: 
    stuff() 
except MyBad: 
    print('got it') 
+3

여기에 어떤 오류가 있습니까? 파이썬 3에서는 다음과 같은 메시지가 나타납니다 :'TypeError : BaseException을 상속받지 않는 클래스를 잡는 것은 허용되지 않습니다. ' – EdChum

+0

파이썬 2는 어떤 객체도 예외로 처리 할 수 ​​있다는 것을 알았지 만 [raise raise가 지원하는 범위] (https://docs.python.org/2.7/reference/simple_stmts.html#raise). – chepner

답변

7

MyBad는 예외가 아니며, raise 문은 수 예외와 함께 사용하십시오.

MyBad을 예외로 만들려면 Exception의 하위 클래스로 확장해야합니다. 예를 들어, 다음은 작동합니다

class MyBad(Exception): 
    pass 

def stuff(): 
    raise MyBad 

try: 
    stuff() 
except MyBad: 
    print('got it') 

출력 :

got it 

그러나, 그것이 매개 변수의 사용을 허용하기 때문에, 오히려 클래스 자체보다는 예외 클래스의 인스턴스를 인상하는 것이 좋습니다 , 일반적으로 오류를 설명합니다. 다음 예제에서는이를 보여

class MyBad(Exception): 
    def __init__(self, message): 
     super().__init__() 
     self.message = message 

def stuff(message): 
    raise MyBad(message) 

try: 
    stuff("Your bad") 
except MyBad as error: 
    print('got it (message: {})'.format(error.message)) 

출력 :

got it (Your bad) 
+0

아하나. 나는 그곳에있는 나무 숲을 정말로 잃어 가고 있었다. – user8048576

+0

@ user8048576 글쎄, 예외가 아닌 것들을 던질 수있는 많은 언어가있다. 그래서 이해하기 쉬운 실수 다 ^^ –

2

당신은 클래스 (적어도 빈 하나를) 만들지 않고 사용자 지정 예외를 발생시킬 수 없습니다. 당신이 패스를 사용하는 경우

class MyBad(Exception): 
    pass 
    # def __init__(self, txt): 
    #  print(txt) 

def stuff(): 
    raise MyBad('test') 

try: 
    stuff() 
except MyBad: 
    print('got it') 

, 당신은해야합니다 :

got it

을 당신이 __init__를 사용하는 경우 당신이 원하는대로 당신은 패스 대신 또한 __init__ 함수를 사용하여 사용자 지정 텍스트를 추가 할 수 있습니다

() 댓글에, 당신은 가질 것입니다

test and got it