Cannot understand the purpose of ctx.throw's behaviour
```
const Koa = require('koa')

const app = new Koa()

app.use(async ctx => {
  ctx.throw('aaa')
})
app.listen(4000)
```
This will throw a real javascript runtime error, and gives requester a response `InternalServerError: aaa`.

So, the code below looks weird:
```
try {
    const {username, password} = ctx.request.body
    const user = getUserFromDB(username)
    if (user.password === password) {
      ctx.status = 200
    } else {
      ctx.throw(401, 'Invalid username or password')
      // this information should return to requester directly, but in fact, it was caught by below `catch`, and return a 500 error to the requester.
    }
  } catch (e) {
    ctx.throw(500, 'some other code error')
  }
```

And there is anther situation:
When I use `supertest` to test my server, when run into  `ctx.throw(500, 'blabla')`, it will shows on test result , it is very ugly...

![image](https://user-images.githubusercontent.com/9784767/31052520-4daffb9e-a64c-11e7-85de-01a4222c118e.png)

I known this is cause by I use the koa instance in my test case, but any other best practice? Thanks.

~~I think , `ctx.throw` not throw a real javascript runtime error will help above two situation~~
