先贴个 w3 规范的链接。
exception 和 error event 都会由 onerror 抛出。不过在处理 error event 时 onerror 回调本身并没有多大用处。
一个重要原因是有这么一个规定,在某些条件下不允许 onerror 的 event 携带说明原因的信息,如图:
即发生以上情况时,只能知道出错了,没法知道到底什么错。
虽然是有条件的限制,但是只要不能覆盖所有的情况,就不应该依赖 onerror。而且条件还这么多
不过值得注意的是,error event 只有一种情况下会发生,那就是在 onclose 之前。原文是:
就是第二条里的这个 simple event named error。
这时,error event 一定会紧接着 onclose,并且由于 onclose 的 event 允许设置自定义 code,可以在这里对 error 做比较详细的处理。
话又说回来了,如果只是做一些粗略的判断还是可以的,毕竟至少可以在 onerror 中区分发生的是 exception 还是 error event。
但是!规范这种东西...我们知道浏览器经常不会严格按照规范实现,对于 websocket,我也不知道是不是完全按照规范实现的。不过从目前测试来看,应该没啥问题...
出了问题别找我...
另外,一些想当然会触发 onerror 的情况实际上并不会发生。
比如连接后立即调用 send() 时,会在 onerror 抛一个 Still in CONNECTING state 的 exception。既然这样,那么断开后再调用 send() 感觉也是类似的情况,应该也会有 exception 吧?
并不会。
对于这个情况,只能提前做处理,阻止 send(),或 send() 之前判断一下 readyState。