Mam funkcję, która może zwrócić jedną z trzech rzeczy:
- sukces (
True) - awaria (
False) - błąd odczytu / analizy strumienia (
None)
Moje pytanie brzmi, czy nie mam testować przeciwko, Trueczy też Falsejak mam zobaczyć, jaki jest wynik. Poniżej przedstawiam, jak obecnie to robię:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
czy to naprawdę jest tak proste, jak usunięcie == Trueczęści, czy powinienem dodać typ danych tri-bool. Nie chcę, aby simulatefunkcja zgłaszała wyjątek, ponieważ jedyne, co chcę, aby program zewnętrzny zrobił z błędem, to zarejestrowanie go i kontynuowanie.
simulatefunkcji łapię wszystkie wyjątki; Nie chcę, aby cokolwiek, co dzieje się w symulatorze, zatrzymywało działanie reszty programu (i przetwarzanie następnego elementu). Ale odpowiedzi sprawiają, że zmieniam zdanie.
simulatecoś, co może złapać i spróbować ponownie, to dobrze. Ale jeśli „zawiedzie”, nie powinien powrócić None. Powinien po prostu zgłosić wyjątek do skryptu, który go wywołał. Tak czy inaczej, simulatejest skończone. Zwracanie Nonenie jest tak pomocne, jak zgłoszenie odpowiedniego wyjątku - lub zezwolenie na propagację wyjątku do simulateskryptu wywołującego w celu obsługi.
except Exception:zamiast tego. To wychwytuje wszystkie „prawdziwe” błędy, wraz z Warningi StopIteration. Pozwala on KeyboardInterrupti SystemExitprzez chociaż. Jeśli naprawdę chcesz je złapać, prawdopodobnie najlepiej jest użyć innej, zewnętrznej try / z wyjątkiem lub innej struktury, która wyraźnie dokumentuje twoje zamiary, ponieważ nie są to „błędy”. (Ale powiedziałem "prawie nigdy" ... być może w twoim przypadku naprawdę chcesz złapać wszystko, a nawet uniemożliwić Ctrl-C lub sys.exit()wyjście z niego itp.)