Esimerkki poikkeuksesta JSON:lla JavaScriptissä
Oletetaan, että meille tulee jostain ulkoisesta lähteestä JSON tuotteella:
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
Tiedät jo, että menetelmä JSON.parse
heittää poikkeuksen, jos JSON on virheellinen.
Siepataan tämä poikkeus:
try {
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
} catch (error) {
// reagoidaan jotenkin poikkeukseen
}
Kuitenkin voi olla tilanteita, että JSON itsessään on oikein, mutta se ei sisällä tarvitsemiamme kenttiä, esimerkiksi hintakenttä puuttuu:
let json = '{"product": "apple", "amount": 5}'; // hinta puuttuu
Sanotaan, että tämä on myös poikkeustilanne ja heitämme tällaisessa tapauksessa oman mukautetun poikkeuksen:
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: 'tuotteelta puuttuu hinta tai määrä'
};
}
} catch (error) {
// reagoidaan jotenkin poikkeukseen
}
Nyt catch -lohko saa kahden tyyppisiä
poikkeuksia: joko JSON on yleisesti oikein,
ja silloin poikkeus on tyyppiä SyntaxError,
tai JSON on oikein, mutta se ei sisällä tarvittavia
kenttiä, ja silloin poikkeus on tyyppiä
ProductCostError.
Siepataan catch -lohkossa nämä
poikkeustyypit:
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: 'tuotteelta puuttuu hinta tai määrä'
};
}
} catch (error) {
if (error.name == 'SyntaxError') {
alert('Virheellinen JSON-tuote');
} else if (error.name == 'ProductCostError') {
alert('Tuotteelta puuttuu hinta tai määrä');
}
}
Oletetaan, että saat JSONin seuraavanlaista muotoa:
let json = `[
{
"name": "user1",
"age": 25,
"salary": 1000
},
{
"name": "user2",
"age": 26,
"salary": 2000
},
{
"name": "user3",
"age": 27,
"salary": 3000
}
]`;
Tarkista tämä JSON yleisen oikeellisuuden varalta jäsentämisen yhteydessä, ja jäsentämisen jälkeen tarkista, että tuloksena on taulukko, eikä jotain muuta. Jos tuloksena ei ole taulukko - heitä poikkeus.