Repository: koajs/koa (js)

Issue:
Assert in ctx.onerror not caught
I had a promise that rejected with a string as an error instead of a proper Error object. There is an [assert in context.js](https://github.com/koajs/koa/blob/c307c81c4313e13ed8464aafbccd1544e8ecf3a8/lib/context.js#L106), but it's never caught in [application.js](https://github.com/koajs/koa/blob/c307c81c4313e13ed8464aafbccd1544e8ecf3a8/lib/application.js#L128) so both the error string and the assert are silently swallowed and no response is sent to the client.

Pull request description:
non-error thrown, fixed #432
don't block the response

Patch:
diff --git a/lib/context.js b/lib/context.js
index e81077c..fa13a71 100644
--- a/lib/context.js
+++ b/lib/context.js
@@ -7,7 +7,6 @@ var createError = require('http-errors');
 var httpAssert = require('http-assert');
 var delegate = require('delegates');
 var statuses = require('statuses');
-var assert = require('assert');
 
 /**
  * Context prototype.
@@ -103,7 +102,7 @@ var proto = module.exports = {
     // to node-style callbacks.
     if (null == err) return;
 
-    assert(err instanceof Error, 'non-error thrown: ' + err);
+    if (!(err instanceof Error)) err = new Error('non-error thrown: ' + err);
 
     // delegate
     this.app.emit('error', err, this);


Test patch:
diff --git a/test/context/onerror.js b/test/context/onerror.js
index b5d8132..9db2259 100644
--- a/test/context/onerror.js
+++ b/test/context/onerror.js
@@ -93,4 +93,22 @@ describe('ctx.onerror(err)', function(){
       })
     })
   })
+
+  describe('when non-error thrown', function(){
+    it('should response non-error thrown message', function(done){
+      var app = koa();
+
+      app.use(function *(next){
+        throw 'string error';
+      })
+
+      var server = app.listen();
+
+      request(server)
+      .get('/')
+      .expect(500)
+      .expect('Content-Type', 'text/plain; charset=utf-8')
+      .expect('Internal Server Error', done);
+    })
+  })
 })