Let's consider the catch
-block of
the task with product JSON:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Invalid JSON of the product');
} else if (error.name == 'ProductCostError') {
alert('Product has no price or amount');
}
}
As you can see, we catch the two exceptions
we planned and somehow react to it. But what
happens if an exception of a different type
that we didn't expect occurs? In this case,
it will also fall into a catch
-block,
but there will be no reaction to this, since
the exception with a different type simply
will not fall into any of our IFs.
When I say that there will be no reaction, I mean that there really is none: there will not even be an error thrown into the console. Our code just silently won't work.
Therefore, there is the following rule: your
code should only catch exceptions that it
knows how to handle. If the exception is not
known, then it must be rethrow further
with throw
. In this case, someone more
knowledgeable will catch it above, or an
exception will be thrown into the console
as an error.
Let's fix our code:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Invalid JSON of the product');
} else if (error.name == 'ProductCostError') {
alert('Product has no price or amount');
} else {
throw error; // rethrow the exception further
}
}
Given the following code:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('ran out of storage space');
}
if (error.name == 'SyntaxError') {
alert('invalid json');
}
}
What's wrong with this code? Fix it for a better one.