Handling exceptions globally and gracefully is essential part of any application. This reduces the scattered try-catch
cases and enable to handle everything from one point.
In this article, we will explore how to implement global exception handling when making Api calls in an SPA design. We will use VueJs for demonstration along with Axios packages to assist the Http calls.
Axios Interceptors
Interceptors in axios provide a great oppurtunity to handle responses at a single point. Interceptors are methods which is invoked for every axios request and hence, allows you to intercept and transform the response before it makes its way to calling method.
To begin with, let us head over to our main.js and import axios
import axios from "axios";
Axios exposes two types of interceptors, one each for request and response.
Response Interceptor
For our purpose, we need the response interceptor (we will breifly speak about the request interceptor later). Axios invokes the response interceptor after the request has been send and response recieved. You could intercept this response using axios.interceptors.response.use
, modify it to suit your needs before sending it back to the calling method.
axios.interceptors.response.use(
(response) => successHandler(response),
(error) => exceptionHandler(error)
);
The method accepts two parameters (second one is optional), each corresponding to a valid and error Response, which would be invoked depending on whether the request has succeeded or failed.
Let us plugin our interceptor in main.js to intercept the errors.
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
switch (error.response.status) {
case 401:
// Handle Unauthorized calls here
// Display an alert
break;
case 500:
// Handle 500 here
// redirect
break;
// and so on..
}
if (error.response.status == 400) {
}
return Promise.reject(error);
}
);
I ususually handle my BadRequst calls within the component. I could hence write a special response in the switch case for Error Code 400, which does the same for me.
Modifying the switch case,
switch (error.response.status) {
case 400:
return {
data: null,
hasError: true,
error: [error.response.data],
};
case 401:
// Handle Unauthorized calls here
// Display an alert
break;
case 500:
// Handle 500 here
break;
// and so on..
}
As seen, the interceptors provides us a global platform the handle exceptions.
Request Interceptor
A word about the request interceptor before signing off – The request interceptors are called each time before the request is made.
This provides an great oppurtunity to inject/modify headers to include authentication tokens. For example,
axios.interceptors.request.use((request) => {
const header = getHttpHeader(); // get your custom http headers with auth token
request.headers = header;
return request;
});
The interceptors could be also used to show busy indicators while the request is being processed as both request interceptor and response interceptor provies us a window of oppurtunity to display a indicator before the request is send out and hide the indictor as soon as the response is recieved.
Hope that was useful.