Mam pytanie, mianowicie chcę zczytać inta i w przypadku kiedy operacja się nie powiedzie przechwycić wyjątek ValueError
, z tą różnicą że zamiast domyślnego komunikatu invalid literal for int() with base 10: 'regrg'
chcę przekazać do konstruktora ValueError
własny komunikat. Czy w poniższym kodzie dobrze to robię? Mam na myśli zagnieżdżoną instrukcję try
wewnątrz instrukcji try
w funkcji read_date
. Chcę wiedzieć czy ta dobra jest dobra, czy istnieją sprytniejsze sposoby na to.
Przykładowy kod:
def read_date():
valid = False
year = None
era = None
while not valid:
try:
print('Enter a year in the format year [BCE|CE]. Note that part BCE|CE is optional.')
print("If era won't be specified, then default value will be CE.")
date = input('> ')
if date.isnumeric():
year = date
era = Era.CE
else:
year = date.split()[0]
era = date.split()[-1]
if era == 'BCE':
era = Era.BCE
elif era == 'CE':
era = Era.CE
else:
raise ValueError('Error: invalid era. Valid choices are BCE and CE.')
try:
year = int(year)
except ValueError:
raise ValueError('Error: year must be an integer.')
if year < 1:
raise ValueError('Error: year must be greater than 0.')
except ValueError as e:
print(e)
else:
valid = True
return HistoricalDate(year=year, era=era)