Przykład wyjątku z JSON w JavaScript
Załóżmy, że skądś ze świata zewnętrznego przychodzi do nas JSON z produktem:
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
Wiesz już, że metoda JSON.parse
będzie rzucać wyjątek, jeśli JSON jest nieprawidłowy.
Przechwyćmy ten wyjątek:
try {
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
} catch (error) {
// w jakiś sposób reagujemy na wyjątek
}
Jednak może się zdarzyć, że sam JSON jest poprawny, ale nie zawiera potrzebnych nam pól, na przykład brakuje pola z ceną:
let json = '{"product": "apple", "amount": 5}'; // brak ceny
Powiedzmy, że to także jest sytuacja wyjątkowa i w takim przypadku będziemy rzucać własny, niestandardowy wyjątek:
try {
let json = '{"product": "apple", "amount": 5}';
let product = JSON.parse(json);
if (product.price !== undefined && product.amount !== undefined) {
alert(product.price * product.amount);
} else {
throw {
name: 'ProductCostError',
message: 'brak ceny lub ilości produktu'
};
}
} catch (error) {
// w jakiś sposób reagujemy na wyjątek
}
Teraz blok catch będzie otrzymywać dwa typy
wyjątków: albo JSON jest całkowicie nieprawidłowy,
i wtedy będzie wyjątek typu SyntaxError,
albo JSON jest poprawny, ale nie zawiera potrzebnych
nam pól, i wtedy będzie wyjątek typu
ProductCostError.
Przechwyćmy te typy wyjątków w bloku catch:
try {
let json = '{"product": "apple", "amount": 5}';
let product = JSON.parse(json);
if (product.price !== undefined && product.amount !== undefined) {
alert(product.price * product.amount);
} else {
throw {
name: 'ProductCostError',
message: 'brak ceny lub ilości produktu'
};
}
} catch (error) {
if (error.name == 'SyntaxError') {
alert('Nieprawidłowy JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nie ma ceny lub ilości');
}
}
Załóżmy, że przychodzi do ciebie JSON w takiej postaci:
let json = `[
{
"name": "user1",
"age": 25,
"salary": 1000
},
{
"name": "user2",
"age": 26,
"salary": 2000
},
{
"name": "user3",
"age": 27,
"salary": 3000
}
]`;
Sprawdź ten JSON pod kątem ogólnej poprawności during parsing, a po sparsowaniu sprawdź, czy w wyniku otrzymujemy tablicę, a nie coś innego. Jeśli w wyniku nie otrzymujemy tablicy - rzuć wyjątek.