2

初心者レベルのPythonの本を3冊読んだことがありますが、それでも例外を理解していません。

誰かが私に高レベルの説明をしてもらえますか?

例外とは、コードまたはプロセスのエラーであり、コードが機能しなくなることを理解していると思います。

4

5 に答える 5

3

アセンブリ言語や C で書いていた昔は、失敗する可能性のある関数を呼び出すたびに、それが成功したかどうかを確認する必要がありました。したがって、次のようなコードになります。

def countlines(path):
    f = open(path, 'r')
    if not f:
        print("Couldn't open", path)
        return None
    total = 0
    for line in f:
        value, success = int(line)
        if not success:
            print(line, "is not an integer")
            f.close()
            return None
        total += value
    f.close()
    return total

例外の背後にある考え方は、これらの例外的なケースについて心配する必要はなく、次のように書くだけです。

def countlines(path):
    total = 0
    with open(path, 'r') as f:
        for line in f:
            total += int(line)
    return total

Python がファイルを開くことができない場合、または行を整数に変換できない場合、例外が発生し、自動的にファイルが閉じられ、関数が終了し、プログラム全体が終了して、有用なデバッグ情報が出力されます。

場合によっては、例外でプログラムを終了させるのではなく、例外を処理したいことがあります。たとえば、エラー メッセージを出力してから、別のファイル名をユーザーに尋ねたい場合があります。

while True:
    path = input("Give me a path")
    try:
        print(countlines(path))
        break
    except Exception as e:
        print("That one didn't work:", e)

例外が達成しようとしている基本的な考え方を理解したら、チュートリアルには多くの有用な情報が含まれています。

さらに詳しい背景情報が必要な場合は、ウィキペディアが役に立ちます (ただし、基本的な考え方を理解するまでは、この記事はあまり役に立ちません)。

それでもわからない場合は、より具体的な質問をしてください。

于 2012-11-21T01:05:55.353 に答える
1

Python のドキュメント: http://docs.python.org/2/tutorial/errors.html

大まかな説明として、 を割りたいとしましょうvarA / varB。が 0 にならないことはわかっていvarBますが、除算を行うたびにチェックを実行したくない場合があります。

if varB != 0:
  varA / varB

例外を使用して、最初に条件を実行せずにブロックを試してから、ブロックで問題が発生したかどうかに基づいてプログラムの動作を処理できtryます。次のコードでは、 if varB == 0, then 'oops' がコンソールに出力されます:

try:
  varA / varB
except ZeroDivisionError:
  print 'oops'

使用できる例外のリストは次のとおりです: http://docs.python.org/2/library/exceptions.html#exceptions.BaseException

ただし、失敗する可能性があることがわかっている場合は、python コンソールを開いて、発生する例外を確認できます。

>>> 1 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
于 2012-11-21T01:08:34.287 に答える
1

それを始めるのに最適な場所は、Python の組み込み例外のリストです。ほとんどの例外はそこから派生しているためです。

誰でも好きなエラーを投げることができ、それをキャッチして却下することもできます。__get_site_file()ファイルがパスのリストのいずれにも見つからない場合に例外をスローするif/else の代わりに、処理に例外を使用する簡単なスニペットを次に示します。その特定の例外にもかかわらず、コードは引き続き機能します。ただし、ファイルが存在するがアクセス許可で読み取りが許可されていない場合、コードはキャッチされないエラーをスローして実行を停止します。

def __setup_site_conf(self):                                                
    # Look for a site.conf in the site folder                              
    try:                                                                    
        path = self.__get_site_file('site.conf')                            
        self.__site_conf = open(path).read()                                
    except EnvironmentError:                                                
        self.__site_conf = self.__get_site_conf_from_template()             
于 2012-11-21T00:59:41.007 に答える
-1

例外は必ずしもエラーではありません。それらは、コードが (すぐに) 対処方法がわからないものに遭遇したときに発生するものです。コードの作成方法によっては、これは完全に許容される場合があります。たとえば、ユーザーに数字を入力するように依頼したとします。次に、そのテキスト (文字列) を数値 (int) に変換しようとします。ただし、ユーザーが「cat」と入力すると、例外が発生します。ただし、コードでその例外を処理することもできます。ブレークするのではなく、ユーザーに再試行するよう求める小さなメッセージを表示し、数字を使用してください。私が話していることを確認するには、このリンクを見てください: http://www.tutorialspoint.com/python/python_exceptions.htm また、通常、try、except (または catch) ブロックで例外を処理します。例:

try:
    integer = int(raw_input("Please enter an integer: "))
except Exception, exc:
    print "An error has occured."
    print str(exc)

それが役に立てば幸い!

于 2012-11-21T01:02:36.990 に答える