-3

Python では、クラスのインスタンス化はどのように行われますtryか?except

たとえば、現在 GitHub スクリプトに取り組んでいます。

from github3 import login
user = login(username, password)

最初は、次のように簡単だと思いました。

try:
    user = login(username, password)
except Exception, e:
    print e

ただし、例外を強制した場合 (たとえば、間違った引数を指定した場合)、例外は表示されません。

$ python my-script.py -u 1 -p 1; echo $?
name 'pw' is not defined
0

もう一度やり直してtry/exceptをミックスから外すと、予想される例外が発生します。

$ python my-script.py -u username -p password; echo $?
Traceback (most recent call last):
  File "delete-all-gists.py", line 19, in <module>
    user = login(u, pw)
NameError: name 'pw' is not defined
1 

この質問をしたのは私だけではありませんが、SO-search-fu が失敗している可能性があります...

アップデート

確かに、コメントで述べたように、これを尋ねるとき、私は目を閉じていたようです...

私を投げていたのは、間違ったユーザー名/パスワードが提供された場合、github3login()メソッドが何らかの例外を投げていなかったことだと思います。例えば:

from github3 import login
u = 'foo'
p = 'bar'

try:
    user = login(u, p)
except Exception, e:
    print e

戻り値:

何もない。エラー、例外などはありません。

ただし、予想どおり、次の場合は実際に例外が発生します。

from github3 import login
u = 'foo'
p = 'bar'

try:
    user = login(username, p)
except Exception, e:
    print e

戻り値:

name 'username' is not defined

もちろん、これは、存在しない変数をユーザー名パラメーターとしてlogin()メソッドに意図的に提供して、強制的に例外を発生させたためです。

4

1 に答える 1

3

ブロックを実行するときはいつでもtry/except、発生する例外を合理的に処理できるため、実行する必要があることを忘れないでください。例えば:

username, password = input("Username: "), input("Password: ")
while True:
    try:
        login(username, password)
    except BadPasswordException as e:
        print("Invalid login")
    else:
        # you only get here if there are no exceptions
        break

例外を合理的に処理できない場合は、ログに記録して、プログラムを正常に終了させることをお勧めします。

try:
    foo(some,arguments)
except CthuluHasBeenReleasedException as e:
    logging.fatal("Oh (old) god!")
    sys.exit(1)
于 2014-08-01T16:15:47.497 に答える