0

わかりました、私はPythonにかなり慣れていないので、複数の機能を許可するコンソールウィッチを作成しています。そのうちの1つは、ページソースを取得してページに印刷するか、別の引数がある場合はその引数のファイルに名前を付けることです... 最初の引数は、ソースを取得する Web サイトの URL です。

私のインポートは次のとおりです。

import os, urllib.request

これは私のコードです:

def grab(command, args, argslist):
    if args == "":
        print("The " + command + " command wan't used correctly type help " + command + " for help...")
    if args != "":
        print("This may take a second...")
        try:
            argslistcheck = argslist[0]
            if argslistcheck[0:7] != "http://":
                argslist[0] = "http://" + argslist[0]
            with urllib.request.urlopen(argslist[0]) as url:
                source = url.read()
                source = str(source, "utf-8")
        except IndexError:
            print("Couln't connect")
            source = ""
        try:
            filesourcename = argslist[1] + ".txt"
            filesourceopen = open(filesourcename, "w")
            filesourceopen.write(source)
            filesourceopen.close()
            print("You can find the file save in " + os.getcwd() + " named " + argslist[1] + ".txt.")
        except IndexError:
            print(source)

今はコードを改善しても問題ありませんが、要点に焦点を当てています。現在は動作しています。後でコードを改善します。唯一の問題は、ユーザーが偽の Web サイトまたは存在しない Web サイトのページを入力すると、多くのエラーが返されることです。しかし、私が変更した場合:

except IndexError:
    print("Coulnd't connect")
    source = ""

だけに:

except:
    print("Couldn't connect")
    source = ""

その後、常に「接続できませんでした...」と表示されます。

何か助けはありますか?残りのコードは役に立たないと思ったので、入れませんでした。必要に応じて、すべて入れることができます。

この非表示エラーにタイトルを付けた理由は、ユーザーが 2 番目の引数を入力すると、ユーザーが名前を付けたファイルにソースを保存するため、何らかの理由で接続できなかったと言うだけでまだ機能するためです。

4

1 に答える 1

1
try:
    argslistcheck = argslist[0]
    if argslistcheck[0:4] != "http://":
        argslist[0] = "http://" + argslist[0]
    with urllib.request.urlopen(argslist[0]) as url:
        source = url.read()
        source = str(source, "utf-8")
except IndexError:
    print("Couln't connect")
    source = ""

そのコード ブロックで、IndexError例外を発生させることができるのはargslist[0]. これは、そのリスト内に要素がない場合に発生します。これはおそらくあなたの問題ではありません。

無効なアドレスが入力urlopenされた場合、失敗します。しかし、それは を発生させるのIndexErrorではなく、urllib.error.URLErrorまたはより専門的な を発生させurllib.error.HTTPErrorます。

書くexcept IndexErrorだけでは、そのエラーのみがキャッチされますが、 によって発生した例外はキャッチされませんurlopen。それらもキャッチしたい場合は、別のexceptケースを追加する必要があります。

except IndexError:
    print('Argument is missing')
except urllib.error.URLError:
    print('Could not connect to the URL.')

別の方法は、例外を指定せずに例外をキャッチすることです (これは、最後のコードで行ったことです)。これは、発生するとは予想していなかった例外が隠されるため、通常はお勧めできません。つまり、バグを隠します。したがって、考えられる例外がわずかしかないことがわかっている場合は、それらをキャッチして明示的に処理してください。

于 2013-02-24T19:53:27.490 に答える