1

クラスの例外で問題が発生しています。可能であればメインスクリプトに戻すか、プログラムのクラッシュを回避するソリューションに戻してください。コードをお見せします。

主なスクリプトは次のとおりです。

from requestnew import requestNew


def chooseCountry():
    countryc = input("Enter which country your city is in(in english): ")
    rq.countrychoice.append(countryc)

def chooseCity():
    cityc = cityc = input("Enter the name of the city: ")
    rq.citychoice.append(cityc)

def makeForecast():
    try:
        for day in rq.data['forecast']['simpleforecast']['forecastday']:
            print ("Country: ", rq.countrychoice[-1], "City: ", rq.citychoice[-1])
            print (day['date']['weekday'] + ":")
            print ("Conditions: ", day['conditions'])
            print ("High: ", day['high']['celsius'] + "C", '\n' "Low: ", day['low']['celsius'] + "C", '\n')
    except Exception as e:
        print ("\nHave you typed in the correct country and city?\nBecause we got a" ,'"',e,'"', "error\nplease try again!")
        return menu


if __name__ == '__main__':
    """Introducion"""
    print ("\nThis program lets you see a weather forecast for your choosen city.")
    rq = requestNew()

    while True:
        try:
            print("\nWhen you have typed in country and city, press 3 in the menu to see the weather forecast for your choice.\n")
            menu = int(input("\nPress 1 for country\nPress 2 for city\nPress 3 to see forecast\nPress 4 to exit\n"))
            if menu == 1:
                chooseCountry()
            elif menu == 2:
                chooseCity()
            elif menu == 3:
                rq.forecastRequest()
                makeForecast()
            elif menu == 4:
                print ("\nThank you for using my application, farewell!")
                break
            elif menu >= 5:
                print ("\nYou pressed the wrong number, please try again!")
        except ValueError as e:
            print ("\nOps! We got a ValueError, info:", e, "\nplease try again!")
            continue 

そして、ここに私のクラスコードがあります:

import requests
import json

class requestNew:

    def __init__(self):
        self.countrychoice = []
        self.citychoice = []

    def countryChoice(self):
        self.countrychoice = []

    def cityChoice(self):
        self.citychoice = []

    def forecastRequest(self):
        try:
            r = requests.get("http://api.wunderground.com/api/0def10027afaebb7/forecast/q/" + self.countrychoice[-1] + "/" + self.citychoice[-1] + ".json")
            self.data = r.json()
        except #?

上記でわかるように、def forecastRequest(self):. 問題は、プログラムのクラッシュを回避するために、どの例外とそれを正しく返す方法がわからないことです。

メイン スクリプトを見るとwhile True:、メニューからすべてをループする必要があることがわかります。

3 を押した場合を除いて、プログラム内のすべてが正しく動作します。国または都市elif menu == 3:の両方を選択せず​​に。これは、クラスでリストを使用してから、次のように印刷するためです。入力から最後に追加されたリスト項目を取得します。国や都市を選択せず​​にメニューで 3 を押すと、リストが空になります。def chooseCountry():def chooseCity():def forecastRequest(self):countrychoice[-1]

私の質問は、ユーザーをメインスクリプトのメニューに戻す方法はありexcept #?ますdef forecastRequest(self):か? または、リクエストを作成しようとしたときにリストが空の場合にプログラムがクラッシュするのを回避する他の方法はありますか?

英語で申し訳ありません。説明が乱雑で申し訳ありませんが、可能な限り比較的簡単に理解できるように最善を尽くしました。

4

1 に答える 1

1

制御をメイン ループに戻す場合は、メイン ループで例外をキャッチします。

elif menu == 3:
    try:
        rq.forecastRequest()
    except IndexError:
        # self.countrychoice[-1] will raise an IndexError if self.countrychoice is empty
        # handle error
    else:
        makeForecast()                  
于 2013-11-15T10:59:20.163 に答える