2017-05-22 31 views
1

私は現在、Mark LutzとDavid AscherのLearning Pythonを使って作業していますが、エラーを引き起すコードのセクションが出てきました。私は、Python 2を使って書かれたPython 3とは違って、その本は覚えています。私はどこにでも見えたので誰かが私の問題の解決策を知っていたのだろうかと思っていましたが、私は解決策を見つけることができませんでした。Python 3 - raise文

.........................

MyBad = 'oops' 

def stuff(): 
    raise MyBad 

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

ここにはどんなエラーがありますか? 'TypeError:BaseExceptionを継承しないクラスを捕まえることが許可されていません。 ' – EdChum

+0

Python 2は、オブジェクトを例外として生成することを許可しましたが、[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

あなたはクラス(少なくとも空の1)を作成することなく、独自の例外を発生させることはできません。あなたがパスを使用している場合

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