Tôi đang cố triển khai mô-đun cho các lỗi tùy chỉnh.Lỗi tùy chỉnh và bắt gặp của bluebird với ErrorClass dẫn đến hành vi vô ý
Nó phải có khả năng nhanh chóng một lỗi cá nhân trong phạm vi yêu cầu-tuyên bố của ứng dụng bằng môđun này:
var MyCustomError = require('custom-error')('MyCustomError');
này là mô-đun:
'use strict';
var _CACHE = {};
function initError(name) {
function CustomError(message) {
this.name = name;
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
_CACHE[name] = CustomError;
}
function createCustomError(name) {
if (!_CACHE[name]) {
initError(name);
}
return _CACHE[name];
}
module.exports = createCustomError;
Các yêu cầu-một-liner ở trên là làm việc cho đến nay.
Bây giờ, trong dịch vụ của tôi, tôi muốn bắt lỗi này một cách rõ ràng:
var MyCustomError = require('custom-error')('MyCustomError')
// ...
return fooService.bar()
.catch(MyCustomError, function (error) {
logger.warn(error);
throw error;
})
Nếu tôi từ chối lời hứa của fooService.bar trong thử nghiệm của tôi bằng cách ném một MyCustomError này đang làm việc tuyệt vời.
NHƯNG, điều này chỉ hoạt động vì thử nghiệm của tôi và dịch vụ đang sử dụng cùng một trường hợp của MyCustomError.
Ví dụ: nếu tôi xóa cơ chế lưu trong bộ nhớ cache trong mô-đun lỗi tùy chỉnh của mình, lệnh bắt sẽ không được truy cập/thực thi nữa, vì bluebird không hiểu rằng hai lỗi cùng loại:
function createCustomError(name) {
//if (!_CACHE[name]) {
initError(name);
//}
return _CACHE[name];
}
Mã cụ thể của việc xử lý bluebird nằm trong catch_filter.js, bạn có thể xem right here.
Mặc dù cách tiếp cận không hoạt động trong ứng dụng của tôi, điều này sẽ sớm dẫn đến sự cố khi nhiều mô-đun đang sử dụng mô-đun lỗi tùy chỉnh và chia sẻ cùng một trường hợp không được cung cấp nữa.
Làm cách nào để tôi có thể thiết lập và chạy khái niệm này bằng cách không so sánh các trường hợp, nhưng chính loại lỗi ?
Chúc mừng,
Christopher
Hi Esailija, vì tôi không đăng nhập trong một vài ngày danh tiếng đã tự động bị gán cho bạn. May mắn cho bạn, nhưng kể từ khi bạn là nhà phát triển của bluebird bạn khá xứng đáng với nó :) Mã: Tôi không thấy điểm của bạn như thế nào điều này chấp thuận việc xử lý? Bạn nói về xử lý try-catch cổ điển không phân biệt bluebird? –
@ChristopherĐiều này là dành cho bluebird chỉ – Esailija
Vì vậy, đây là chính xác những gì tôi đang làm trong ví dụ trên - như 'catch (Errors.Entity.IllegalState.predicate, ..)' –