Skip to content

Commit 9f5f67f

Browse files
committed
- keep an original error object in error
- add event handler for taking care lderror in `error` and `unhandledrejection` events
1 parent df14521 commit 9f5f67f

File tree

5 files changed

+83
-11
lines changed

5 files changed

+83
-11
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Change Logs
22

3-
## v2.2.1 (upcoming)
3+
## v2.3.0
44

55
- add 1028 `resource unavailable`
6+
- keep an original error object in `error`
7+
- add event handler for taking care lderror in `error` and `unhandledrejection` events
68

79

810
## v2.2.0

README.md

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ or
2424

2525
## Members
2626

27-
- `id` - lderror deined error code.
28-
- `message` - custom error message (optional)
29-
- `stack` - stacktrace (optional)
30-
- `code` - http status code, if applicable (optional)
31-
- `log` - should this error be logged. default false.
27+
- `id`: lderror deined error code.
28+
- `message`: custom error message (optional)
29+
- `stack`: stacktrace (optional)
30+
- `code`: http status code, if applicable (optional)
31+
- `log`: should this error be logged. default false.
32+
- `error`: an Error object constructed
3233

3334

3435
## Helper Functions
@@ -57,6 +58,11 @@ lderror exports several help functions for making use lderror easier:
5758
- options:
5859
- `o`: user-defined object returned by `rule(id)`.
5960
- `e`: the original error object.
61+
- `lderror.eventHandler`: helper event handler. See below section for more information.
62+
- `eventHandler` provides two member functions:
63+
- `error(evt)`: handler for `error` event.
64+
- `rejection(evt)`: handler for `unhandledrejection` event.
65+
- for both functions, return true if `lderror` is handled. otherwise false.
6066

6167

6268
### Error Handler
@@ -95,11 +101,27 @@ Work along with `@plotdb/block` + `ldcvmgr`:
95101
.catch handler
96102

97103

104+
## error / unhandledrejection events
105+
106+
You can use `lderror.eventHandler.error` and `lderror.eventHandler.rejection` to take care of lderror related errors:
107+
108+
window.addEventListenen("error", lderror.eventHandler.error);
109+
window.addEventListenen("unhandledrejection", lderror.eventHandler.rejection);
110+
111+
These handlers simply check if incoming error is a lderror with original error object; if it is, additional information is logged and the original error object will be thrown for showing stacktrace information.
112+
113+
To wrap them along with your own event handler, test its return value and proceed if it returns `false`:
114+
115+
window.addEventListenen("error", function(evt) {
116+
if(!lderror.eventHandler.error) { /* your own handler */ }
117+
});
118+
119+
98120
## Customized information
99121

100122
Additional information can be added if needed:
101123

102-
- redirect - instruct a redirect url in order to proper take care of this error.
124+
- redirect - instruct a redirect url in order to proper take care of this error.
103125

104126

105127
## License

dist/index.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
1028: "resource unavailable"
3636
};
3737
lderror = function(opt, id){
38-
var _id, that;
38+
var _id, that, e;
3939
opt == null && (opt = "");
4040
id == null && (id = 0);
4141
if (!(this instanceof lderror)) {
@@ -64,8 +64,9 @@
6464
: idmap[0] + " (id: " + (this.id || 0) + ")";
6565
}
6666
}
67-
this.stack = new Error().stack;
6867
this.name = lderror.prototype.name;
68+
this.stack = (e = import$(new Error(), this)).stack;
69+
this.error = e;
6970
return this;
7071
};
7172
lderror.prototype = import$(Object.create(Error.prototype), {
@@ -140,6 +141,30 @@
140141
};
141142
return h;
142143
};
144+
lderror.eventHandler = {
145+
error: function(e){
146+
if (e.error && e.error.name === 'lderror' && e.error.error && e.error !== e.error.error) {
147+
console.warn("uncaught lderror", e.error);
148+
console.warn("with its internal Error object thrown:");
149+
e.preventDefault();
150+
setTimeout(function(){
151+
throw e.error.error;
152+
}, 0);
153+
return true;
154+
}
155+
return false;
156+
},
157+
rejection: function(e){
158+
if (e.reason && e.reason.name === 'lderror' && e.reason.error) {
159+
console.warn("Unhandled rejection with lderror:", e.reason);
160+
console.warn("with its internal Error object thrown:");
161+
throw e.reason.error;
162+
e.preventDefault();
163+
return true;
164+
}
165+
return false;
166+
}
167+
};
143168
if (typeof module != 'undefined' && module !== null) {
144169
module.exports = lderror;
145170
} else if (typeof window != 'undefined' && window !== null) {

dist/index.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lde.ls

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,12 @@ lderror = (opt="", id = 0) ->
4949
@message = if idmap[@id or 0] => that
5050
else if @id >= 100 and @id < 600 => "http code: #{@id}"
5151
else "#{idmap.0} (id: #{@id or 0})"
52-
@stack = (new Error!).stack
5352
# otherwise stringify wont keep the name
5453
@name = lderror.prototype.name
54+
@stack = (e = (new Error!) <<< @).stack
55+
# this is especially useful to handle unhandledrejection.
56+
# simply throw it again gives us the full stack to trace in dev console
57+
@error = e
5558
@
5659

5760
lderror.prototype = Object.create(Error.prototype) <<< do
@@ -88,5 +91,25 @@ lderror.handler = (o={}) ->
8891
h.is-on = ~> !![v for k,v of @s].filter((v)->v).length
8992
h
9093

94+
lderror.event-handler =
95+
error: (e) ->
96+
if e.error and e.error.name == \lderror and e.error.error and e.error != e.error.error =>
97+
console.warn "uncaught lderror", e.error
98+
console.warn "with its internal Error object thrown:"
99+
e.preventDefault!
100+
# add a setTimeout so it will be handled again by this handler
101+
setTimeout (->throw e.error.error), 0
102+
return true
103+
return false
104+
105+
rejection: (e) ->
106+
if e.reason and e.reason.name == \lderror and e.reason.error =>
107+
console.warn "Unhandled rejection with lderror:", e.reason
108+
console.warn "with its internal Error object thrown:"
109+
throw e.reason.error
110+
e.preventDefault!
111+
return true
112+
return false
113+
91114
if module? => module.exports = lderror
92115
else if window? => window.lderror = lderror

0 commit comments

Comments
 (0)