2016-11-17 5 views
4
# python 3.5 
>>> class MyError(Exception): 
... pass 
... 
>>> raise MyError('message') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
__main__.MyError: message 

__main__.MyError: messageの代わりにmessageを印刷する例外が必要です。私は__str____repr__MyErrorとメタクラスの両方で試しましたが、効果はありませんでした。 Pythonインタプリタはどこから__main__.MyErrorを取得しますか?例外メッセージをカスタマイズする方法

Iが容易MyErrorのインスタンスが印刷される方法を変更することができます、そしてどのMyError自体は、印刷、どちらも例外メッセージに影響を有していない。

class MyType(type): 
    def __str__(self): 
    return '***' 

class MyError(Exception, metaclass=MyType): 
    def __str__(self): 
    return 'xxx' 

print(MyError) # *** 
print(MyError()) # xxx 
raise MyError() # still the same 
+0

そして、あなたドンメッセージを捕まえて印刷したくないのですか? – yelsayed

+0

'__main __。MyError'は例外として発生させたオブジェクトです。 – AChampion

+0

@AChampionもちろん、私は通常、オブジェクトの文字列表現をカスタマイズすることができます。この場合はそうではありません。 – max

答えて

2

私が得ることができる最も近いものはこれです:

In [6]: raise MyError("some message") 
--------------------------------------------------------------------------- 
MyError         Traceback (most recent call last) 
<ipython-input-2-4bd48c5b1ce0> in <module>() 
----> 1 raise MyError("some error message") 

MyError: some error message 

クラス名の前に大手__main__.テキストを削除する方法があります。そこクラス名自体を削除する方法がさえているため、出力は次のようになります。

In [6]: raise MyError("some error message") 
--------------------------------------------------------------------------- 
              Traceback (most recent call last) 
<ipython-input-6-4bd48c5b1ce0> in <module>() 
----> 1 raise MyError("some error message") 

: some error message 

しかし、私は:記号を削除する方法を見つけることができませんでした。私の推測では、例外出力を他の出力タイプとはっきりと区別するために、この記号がインタプリタによって生成されるということです。

ここで私が使用ソリューションです:

class MyError(Exception): 
    __module__ = None 
    def __init__(self, *args, **kwargs): 
     Exception.__init__(self, *args, **kwargs) 
     self.__class__.__name__ = "CustomTextHere" 

そして、いくつかの出力:

In [8]: MyError 
Out[8]: MyError 

In [9]: MyError() 
Out[9]: None.CustomTextHere() 

In [11]: raise MyError() 
--------------------------------------------------------------------------- 
CustomTextHere       Traceback (most recent call last) 
<ipython-input-11-f389ee70e588> in <module>() 
----> 1 raise MyError() 

CustomTextHere: 

In [12]: raise MyError("some error message") 
--------------------------------------------------------------------------- 
CustomTextHere       Traceback (most recent call last) 
<ipython-input-12-4bd48c5b1ce0> in <module>() 
----> 1 raise MyError("some error message") 

CustomTextHere: some error message 

あなただけ:記号を取得したい場合は、あなたが使用します。

self.__class__.__name__ = "" 
1

そのラインの最初の部分、前コロンは、タイプ例外発生です。

>>> class MyError(Exception): 
...  pass 
... 
>>> print(type(MyError("message"))) 
<class '__main__.MyError'> 

通常カスタム例外クラスには、いくつかのファイル(たとえば、file.py)の内側に入れ、そして輸入なので、その場合には、それはのfile.MyError isnteadになります:によって返されるものと同じ形式であります__main__.MyError。しかし、現在、メインのpythonファイルで定義されているExceptionを使用しているので、使用する必要がある唯一の名前空間は__main__です。

要するに、あなたがそれをよりきれいにしたいのであれば、あなたが望む名前の別のファイルに入れてください。

+1

' 'は' MyError'クラスの文字列表現です。 MyErrorのメタクラスで '__str__'を定義することで簡単にカスタマイズできます。しかし、私が言ったように、私はPythonの例外レポートが示すものを変更することはできませんでした。また、 '__main __。MyError'は' 'と同じではありません。 – max

+0

だから私はPythonのソースコードを掘り下げてみました。それは文字列が決定される方法であると思われます。です。 ;クラスの名前を変更するか、MyError .__ name__を動的に変更してクラス名を簡単に変更できます。しかし、モジュール名を動的に変更する方法はないと思います。これは、実行中のファイルに基づいて、Cソース(コメントの最後にリンク)で決定されるためです。私はこの仕組みが完全にはっきりしていないので、可能かもしれません。 https://github.com/python/cpython/blob/master/Python/pythonrun.c#L756 –

+0

はい、そうです。これをあなたの答えに加えることができますか? – max

関連する問題