Có vẻ như tôi đến muộn :), nhưng cuộc thảo luận khá thú vị nên .. đây rồi ... Giả sử bạn muốn tạo một trình xử lý lỗi và bạn đang sử dụng lớp xử lý ngoại lệ của riêng mình như:
function errorHandler(error){
this.errorMessage = error;
}
errorHandler.prototype. displayErrors = function(){
throw new Error(this.errorMessage);
}
Và bạn đang quấn mã của mình như thế này:
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message');
}
}catch(e){
e.displayErrors();
}
Hầu hết có thể bạn sẽ có trình xử lý lỗi trong một tệp .js riêng biệt.
Bạn sẽ nhận thấy rằng trong bảng điều khiển lỗi của firefox hoặc chrome, số dòng mã (và tên tệp) được hiển thị là dòng (tệp) đưa ra ngoại lệ 'Lỗi' chứ không phải ngoại lệ 'errorHandler' mà bạn thực sự muốn để gỡ lỗi dễ dàng. Bỏ qua các ngoại lệ của riêng bạn là rất tốt nhưng đối với các dự án lớn, việc xác định vị trí của chúng có thể là một vấn đề, đặc biệt nếu chúng có các thông điệp tương tự. Vì vậy, những gì bạn có thể làm là chuyển một tham chiếu đến một đối tượng Lỗi thực sự trống cho trình xử lý lỗi của bạn và tham chiếu đó sẽ chứa tất cả thông tin bạn muốn (ví dụ: trong firefox, bạn có thể lấy tên tệp và số dòng, v.v. ; trong chrome, bạn nhận được một cái gì đó tương tự nếu bạn đọc thuộc tính 'ngăn xếp' của trường hợp Lỗi). Câu chuyện ngắn, bạn có thể làm như sau:
function errorHandler(error, errorInstance){
this.errorMessage = error;
this. errorInstance = errorInstance;
}
errorHandler.prototype. displayErrors = function(){
//add the empty error trace to your message
this.errorMessage += ' stack trace: '+ this. errorInstance.stack;
throw new Error(this.errorMessage);
}
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message', new Error());
}
}catch(e){
e.displayErrors();
}
Bây giờ bạn có thể nhận được tệp thực tế và số dòng đã đưa ra ngoại lệ tùy chỉnh cho bạn.