2

これを修正する方法がわかりません。私はプログラムを再入力しようとしました。

最後のメイン関数で予期しないインデント エラーが発生します。

resident = 81
nonresident = 162


def main():

    # initialize counters and total tuition
    resident_counter = 0
    nonresident_counter = 0
    total_tuition = 0

    print("Name \tCode\tCredits\tTuition")
    print

    try:
        # open the data file
        infile = open('enroll.txt', 'r')

        # read the first value from the file
        student_name = infile.readline()

        # continue reading from file until the end
        while student_name != '':

            # strip the new line character and print the student's name
            student_name = student_name.rstrip('\n')
            print(student_name, end='\t')

            # read the code type, strip the new line, and print it
            code = infile.readline()
            code = code_type.rstrip('\n')
            print(code_type, end='\t')

            # read the number of credits, strip the new line, and print it
            credits = infile.readline()
            credits = int(credits)
            print(format(credits, '3.0f'), end='\t')

            # check the room type and compute the rental amount due 
            # increment the appropriate counter
            if code_type == "R" or room_type == "r":
                payment_due = credits * resident
                resident_counter += 1
            elif code_type == "N" or room_type == "n":
                payment_due = credits * nonresident
                nonresident_counter += 1
            elif code_type != "R" or code_type != "r" or code_type != "N" or code_type != "n":
                payment_due = 0

            # accumulate the total room rent
            tuition += payment_due

            # print the appropriate detail line
            if payment_due == 0:
                print('invalid code')
            else:
                print('$', format(tuition, '8,.2f'))

            # get the next studen't name
            student_name = infile.readline()

        # close the input file
        infile.close()

        # print the counters and payment total amount
        print
        print('total number of resident students: ', resident_counter)
        print('total number of nonresident: ', nonresident_counter)
        print
        print('total students: ', end='')
        print('$', format(tuition, ',.2f'))
# execute the main function

main()
4

7 に答える 7

6

exceptに一致する句がありませんtry

于 2012-11-05T19:47:51.073 に答える
5

他の誰もが言っていることにもかかわらず、 を持っている場合、 を持っているtry必要exceptはありません:except またはfinallyを持っている必要があります。

つまらないと思われるかもしれませんが、コピーしたコードが実際に使用されていた可能性はかなりありますfinally(たとえば、C/Java スタイルの手動クリーンアップを実行している場合、クリーンアップ コードが常に実行されるようにするためなど)。

いずれにせよ、except句を追加することは正解ではありません。実際にエラーを処理または無視しようとしている場合は、はい、except句を追加してください。エラーが発生しても実行されるクリーンアップ コードを追加する場所を探している場合は、finally代わりに句を追加します。どちらも必要ない場合は、そのtry行を削除してください。

于 2012-11-05T20:13:03.777 に答える
2

ifelseステートメントで部屋タイプとコードタイプを混在させています。また、exceptステートメントが欠落しています。これは、mainを呼び出す前の最後の2行である必要があります。

それは読むべきです:

except IOError:
    print('an error occurred trying to open or read enroll.txt')
于 2012-11-06T01:09:40.847 に答える
1

try ステートメントを使用しています。これは、except ブロックが必要であることを意味します

try:
    some code
except:
    pass

単純化されていますが、問題を解決します。

于 2012-11-05T19:50:35.277 に答える
1

except他の答えは、あなたがあなたと一緒に行く必要があることを(正しく)指摘していますtry:(またはatryをまったく使用しないでください)。これらはデバッグが非常に煩雑tryになる可能性があるため、今後同様の問題をデバッグする方法を説明します。

エラー メッセージは、次のようなものである可能性が高いです。

  File "test.py", line 74
    main()
    ^
IndentationError: unexpected unindent

一見すると、これはあまり役に立たないように見えます。

IndentationErrorあなたが「プログラムを再入力しようとした」という事実は、「これは私のインデントが台無しになっていることを意味します。おそらくどこかに余分なスペースがあるか、スペースとタブなどが混在している可能性があります」と見て考えたように聞こえます。これらは間違いなく有効なIndentationErrors であり、同じ入力エラーを再度行わなければ、プログラムを再入力すると修正されます。(ちなみに、使用する価値のあるテキスト エディターには、すべてのタブを 4 つのスペースに変換して、多くのインデントの問題を回避するオプションがあると思います。)

ただし、エラー テキストを見ると、「unexpected unindent」と表示されます。私にはこれは意味不明なことのように聞こえますが、それが意味することは、python がプログラムを調べているときに、実際よりもインデントする必要があると思われる行に遭遇したということです。(残念ながら、これと同じ種類のエラーは、「unexpected unindent」または「expected an indented block」と呼ばれることがあり、単純な古い として表示されることさえありSyntaxError: invalid syntaxます。)

エラーメッセージが何を意味するかがわかれば、コードを振り返って、Python がなぜそれmain()が変にインデントされていると判断したのかを確認できます。ここに私の思考プロセスのようなものがあります:

  • main()が呼び出される直前に関数定義がありますが、その関数はそのmain()中に入れたいのでしょうか? いいえ、そうではありません。python は、関数定義の後に少なくとも 1 行のコードしか期待していないからです。
  • コードの後に​​インデントすることを「望んでいる」コードは他に何ですか? ifelif、およびwhileすべてそうですが、それらのすべての後にもコードがあります。
  • 唯一の他の「圧子」はtry:. この時点で、try: その後に aexcept:または afinally:を付ける必要があることを知っていて、それを修正するか、修正しないかのどちらかです。それがわからない場合でも、try:その後にインデントされたブロックが続くことがわかり、それがエラーの原因である可能性が高いことを考えると、何try:が機能するかを調べる時が来たと判断してください。

将来的にこのような問題のトラブルシューティングに役立つことを願っています.abarnertの回答とtry/ except/ else/finallyステートメントでエラーを処理するための私のリンクをチェックしてください.

于 2012-11-05T20:43:05.450 に答える
0
  1. 上記のLevLevitskyとdavidが指摘したように、except節はありません。これを解決する最も簡単な方法は、mainを呼び出す前に、コードに次のような行を追加することです。

    except: pass
    
  2. 私があなたのコードに対して持っている2番目のコメントはより文体的ですが、mainの呼び出しの前と、except句の後に、以下を追加できます。

    if __name__ == '__main__':
        main()
    
于 2012-11-05T19:53:40.570 に答える
0

不足している、または余分なものに加えてexcept...finally編集tryされたコードを見ると、インデントに奇妙に混合された色のブロックが表示されます。タブとスペースが混在しているため、インデント不良などの問題が発生する可能性があります。その理由は、インタープリターがタブをどのように解釈すべきかについて異なる考え方をするためです (たとえば、8 列のタブストップと 4 列のタブストップ)。

インデントにタブとスペースを混在させてはなりません。個人的には、スペースのみを使用することをお勧めします。適切なエディターは、TAB キーをスペースに展開したり、既存のタブとスペースの混合を非タブ化することができます。

于 2012-11-05T22:03:03.070 に答える