UNPKG

cordova-plugin-mfp-encrypt-utils

Version:

IBM MobileFirst Platform Foundation Cordova Plugin Encrypt Utils

145 lines (99 loc) 4.27 kB
# verror: richer JavaScript errors This module provides two classes: * VError, for combining errors while preserving each one's error message, and * WError, for wrapping errors. Both support printf-style error messages using [extsprintf](https://github.com/davepacheco/node-extsprintf). ## printf-style Error constructor At the most basic level, VError is just like JavaScript's Error class, but with printf-style arguments: ```javascript var VError = require('verror'); var filename = '/etc/passwd'; var err = new VError('missing file: "%s"', filename); console.log(err.message); ``` This prints: missing file: "/etc/passwd" `err.stack` works the same as for built-in errors: ```javascript console.log(err.stack); ``` This prints: missing file: "/etc/passwd" at Object.<anonymous> (/Users/dap/node-verror/examples/varargs.js:4:11) at Module._compile (module.js:449:26) at Object.Module._extensions..js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10) at process.startup.processNextTick.process._tickCallback (node.js:244:9) ## Causes You can also pass a `cause` argument, which is another Error. For example: ```javascript var fs = require('fs'); var VError = require('verror'); var filename = '/nonexistent'; fs.stat(filename, function (err1) { var err2 = new VError(err1, 'stat "%s" failed', filename); console.error(err2.message); }); ``` This prints out: stat "/nonexistent" failed: ENOENT, stat '/nonexistent' which resembles how Unix programs typically report errors: $ sort /nonexistent sort: open failed: /nonexistent: No such file or directory To match the Unixy feel, just prepend the program's name to the VError's `message`. You can also get the next-level Error using `err.cause()`: ```javascript console.error(err2.cause().message); ``` prints: ENOENT, stat '/nonexistent' Of course, you can nest these as many times as you want: ```javascript var VError = require('verror'); var err1 = new Error('No such file or directory'); var err2 = new VError(err1, 'failed to stat "%s"', '/junk'); var err3 = new VError(err2, 'request failed'); console.error(err3.message); ``` This prints: request failed: failed to stat "/junk": No such file or directory The idea is that each layer in the stack annotates the error with a description of what it was doing (with a printf-like format string) and the result is a message that explains what happened at every level. ## WError: wrap layered errors Sometimes you don't want an Error's "message" field to include the details of all of the low-level errors, but you still want to be able to get at them programmatically. For example, in an HTTP server, you probably don't want to spew all of the low-level errors back to the client, but you do want to include them in the audit log entry for the request. In that case, you can use a WError, which is created exactly like VError (and also supports both printf-style arguments and an optional cause), but the resulting "message" only contains the top-level error. It's also more verbose, including the class associated with each error in the cause chain. Using the same example above, but replacing `err3`'s VError with WError, so that it looks like this: ```javascript var verror = require('verror'); var err1 = new Error('No such file or directory'); var err2 = new verror.VError(err1, 'failed to stat "%s"', '/junk'); var err3 = new verror.WError(err2, 'request failed'); console.error(err3.message); ``` we get this output: request failed That's what we wanted -- just a high-level summary for the client. But we can get the object's toString() for the full details: WError: request failed; caused by WError: failed to stat "/nonexistent"; caused by Error: No such file or directory For a complete example, see examples/werror.js. # Contributing Contributions welcome. Code should be "make check" clean. To run "make check", you'll need these tools: * https://github.com/davepacheco/jsstyle * https://github.com/davepacheco/javascriptlint If you're changing something non-trivial or user-facing, you may want to submit an issue first.