Wyjątki bywają IMO użyteczne, ale mają swoje wady, największym chyba jest brak wygodnego mechanizmu obsługi ich. Zaczerpnięta jeszcze z C++ konstrukcja try
/catch
w wielu wypadkach bywa tak (...) niewygodna, że ja nie widzę, jak można zapisać to w miarę zwięźle i czytelnie.
Przykład. value
input
a o typie number
ma być sparsowane jako Decimal
i przepchnięte do kontrolerów wyżej zgodnie z Reactową maksymą Lifting State Up. Może być tak, że użytkownik nie poda liczby do input
a i jest to poprawna sytuacja, tyle że wtedy parsowanie jako Decimal
rzuca. Nie wiem, czy jest możliwe, by przeglądarka wysłała event change
w sytuacji, gdy użytkownik wpisał bzdury, ale na wszelki wypadek w takiej sytuacji także chcę przepchnąć w górę null
, no bo z perspektywy logiki trudno to traktować inaczej, jak brak wartości.
Cały kod:
onChange(e) {
let ret;
try {
ret = new Decimal(e.target.value);
} catch(err) {
if (err instanceof Error && /DecimalError/.test(err.message)) {
this.props.onChange(null);
return;
} else {
throw err;
}
}
this.props.onChangeMaks(ret);
}
(sprawdzanie, czy błąd jest rzucony przez Decimal
także na podstawie ichniej dokumentacji.
Dla porównania parseInt
zwraca NaN
przy błędzie parsowania. Gdybym więc mógł użyć parseInt
to obsługa byłaby prosta:
onChange(e) {
const ret = parseInt(e.target.value);
this.props.onChange(!isNaN(ret) ? ret : null);
}
Czy jest jakiś sposób, by przepisać ten kod obsługujący wyjątek parsowania w sensowniejszy sposób?