Welcome back, stellar sailor! We've navigated through JavaScript landscapes, exploring error messages, syntax errors, and logical errors. Today, we'll learn about JavaScript exceptions and how to handle them using the try/catch
mechanism. Exceptions are akin to unexpected events during the execution of your program — similar to receiving incorrect data input when working with a form submission on a web page. Let's embark on this fascinating exploration!
Exceptions are unexpected events that disrupt the normal flow of a program. Imagine typing a website's URL and landing on a page that wasn't supposed to be there. That's an exception! Seemingly, exceptions can halt program execution. Therefore, understanding exceptions and handling them effectively is vital for smooth program execution.
JavaScript exceptions are "special" error objects. When the JavaScript engine encounters unexpected situations or when we deliberately create an error using the throw
statement, an exception gets thrown. The exception contains information about the error for effective debugging.
Let's consider a simple example:
JavaScript1let fruits = ["apple", "orange", "banana"]; 2console.log(fruits[3].toUpperCase()); // This will throw a error, as `fruits[3]` is `undefined`
Here, we're trying to log the uppercase value of the fourth item (index three) in an array that only contains three items. This leads to an exception of calling toUpperCase()
on the undefined
type.
When an error state happens in the code, or whenever you feel you need this, you can also throw a custom error in your code. It's as simple as using a throw
operator together with the Error
, here is an example:
JavaScript1let balance = 100; 2let pieces = 0; 3if (pieces <= 0) { 4 throw new Error("Balance can't be divided into negative non-positive number of pieces"); 5} 6console.log("Divided balance:", balance / pieces);
Think of controlling a spaceship. Errant asteroids, symbolizing exceptions, may damage your ship. In this lesson, we will learn about try/catch
blocks — the equivalent of the spaceship’s handy shields — which allow us to navigate past these exceptions and prevent unexpected crashes.
In JavaScript, the try
block contains the code that could potentially encounter an exception, while the catch
block handles it. Check out this illustration:
JavaScript1const fruits = ["apple", "orange", "banana"]; 2 3try { 4 console.log(fruits[3].toUpperCase()); // This will throw a error, as `fruits[3]` is `undefined` 5} catch (error) { 6 // Log avoided collision information 7 console.log("Exception caught: " + error); // This message will be printed, indicating that an exception has been caught 8 console.log("Error message: " + error.message); 9} 10// Prints: 11// Exception caught: TypeError: Cannot read properties of undefined (reading 'toUpperCase') 12// Error message: Cannot read properties of undefined (reading 'toUpperCase')
Here, we have successfully caught an exception caused by calling toUpperCase
on the undefined
type.
Exceptions can be of various types and are represented by different Error objects such as ReferenceError
, TypeError
, etc. These identifiers help to distinguish one type of exception from another, thereby making our debugging journey more efficient.
A diversified defense strategy can help counter a range of exceptions. A catch
block recognizes different Error types and handles each of them differently, as shown in this illustration:
JavaScript1// Initiate spaceship health status and repair kit status 2let repairKit = undefined; 3 4try { 5 // Display repair kit status in uppercase 6 console.log(repairKit.toUpperCase()); // Exception will occur here as `repairKit` value is not a string 7} catch (error) { 8 // Check if the error is a TypeError 9 if (error instanceof TypeError) { 10 // If yes, log specific error message 11 console.log("Sorry, we cannot proceed - " + error.message); 12 } else { 13 // If no, log generic error message 14 console.log("Other type of error: " + error); 15 } 16} 17// Prints: 18// Sorry, we cannot proceed - Cannot read properties of undefined (reading 'toUpperCase')
This code helps us to handle different types of errors effectively, thereby making our navigation through JavaScript smoother.
Well done! Today, we learned about exceptions and try/catch
blocks, encountered various types of JavaScript error objects, and discovered how to handle different errors. Hands-on exercises await you next — these are crucial for mastering these concepts. Enjoy exploring, and may the code be with you!