extended-exceptions

Easy custom js exceptions for node & browser, AMD.


Keywords
exceptions, browser, server
License
Unlicense
Install
npm install extended-exceptions@2.1.0

Documentation

extended-exceptions.js

Build Status NPM version Bower version Dependency Status Project status license graph status Code Climate Total views Gittip

Introduction

Allow easy declaration of custom javascript errors/exceptions.

Also provides common exceptions for Javascript that are missing in the standard : RuntimeError, NotImplementedError, InvalidArgument, OutOfRange, etc. (inspiration taken from the C++11 standard)

Works in node.js + browser, AMD.

Full testsuite. No dependencies.

Includes special workarounds for Firefox "Error" object which has sometimes a strange behaviour.

License : public domain (http://unlicense.org/)

Interesting reads :

Predefined errors

Note : we keep the "error" naming scheme of standard javascript.

Error (standard)  <-- javascript root exception
+ EvalError       <-- Vanilla javascript exceptions
+ RangeError      <-- ...
+ ReferenceError  <-- ...
+ SyntaxError     <-- ...
+ TypeError       <-- ...
+ URIError        <-- ...
+ ExtendedError   <-- Here start our custom exceptions
  + LogicError
    + InvalidArgument
    + LengthError
    + OutOfRange
    + InvariantNotMet
  + RuntimeError
    + NotImplemented
    + UnknownEnumValue
    + IllegalState

Usage

if (typeof define !== 'function') { var define = require('amdefine')(module); } // node only

define(
[
	'extended-exceptions'
],
function(EE) {
	"use strict";

	// Feature 1 - use one of the predefined errors
	throw new EE.NotImplemented("TODO !");
	throw new EE.InvalidArgument("Please !");

Defining our own exceptions inheriting from an existing one :

define(
[
	'extended-exceptions'
],
function(EE) {
	"use strict";

	// Feature 2 - create a brand new error
	// inheriting from (for example) RuntimeError (could be just Error)
	var CustomJsonSerializationError = EE.create_custom_error("CustomError", EE.RuntimeError);

	// Alternative 1 - use it directly
	throw new CustomJsonSerializationError("Oups !");

	// Alternative 2 - use it to cast an existing error
	try {
		JSON.parse(stuff);
	}
	catch(e) {
		throw new CustomJsonSerializationError(e); // new error will have same stack and message
	}

	...
	
	console.log( caught_error.name );
	console.log( caught_error.message );
	console.log( caught_error.stack );

Catching and testing exceptions :

  • exactly as you expect it.

Works in chai exactly as you expect it :

if (typeof define !== 'function') { var define = require('amdefine')(module); } // node only

define(
[
	'chai',
	'<class under test>',
	'extended-exceptions',
	'mocha'
],
function(chai, CUT, EE) {
	"use strict";

	var expect = chai.expect;
	chai.should();

	describe('Nice stuff', function() {

		describe('processing', function() {

			it('should detect bad state', function() {
				var out = CUT.make_new();

				var tempfn = function() { out.dostuff(); };
				tempfn.should.throw(EE.IllegalStateError, "Not initialized !"); // works fine
			});
		}); // describe feature
	}); // describe CUT
}); // requirejs module

Installation

Bower : bower install extended-exceptions.js Npm : npm install extended-exceptions

Unit tests

Browser : open test_runner/mocha.html Node : npm test