/**
* Created by liyanq on 17/3/26.
* Node.js 中运行的应用程序一般会遇到以下四类错误:
* 1,标准的 JavaScript 错误:
* <EvalError> : 当调用 eval() 失败时抛出。
* <SyntaxError> : 当 JavaScript 语法错误时抛出。
* <RangeError> : 当一个值不在预期范围内时抛出。
* <ReferenceError> : 当使用未定义的变量时抛出。
* <TypeError> : 当传入错误类型的参数时抛出。
* <URIError> : 当一个全局的 URI 处理函数被误用时抛出。
* 2,由底层操作系的触发的系统错误,例如试图打开一个不存在的文件、试图向一个已关闭的 socket 发送数据等。
* 3,由应用程序代码触发的用户自定义的错误。
* 4,断言错误是错误的一个特殊的类,每当 Node.js 检测到一个不应该发生的异常逻辑时会触发。 这类错误通常由 assert 模块触发。
* 所有 Node.js 引起的 JavaScript 和系统错误都是继承自或实例化自标准的 JavaScript 的 <Error> 类,
* 且保证至少提供类中的可用的属性。
*/
const EventEmitter = require("events");
const fs = require('fs');
/*错误的冒泡和捕获
* JavaScript 的 throw 机制的任何使用都会引起异常,异常必须使用 try / catch 处理,否则 Node.js 进程会立即退出。*/
class myEventEmitter extends EventEmitter {
constructor() {
super();
}
showErr() {
this.emit("error", "我是一个myEventEmitter的异常信息");
// throw new Error("我是一个myEventEmitter的异常信息");//这样写直接崩溃~
}
}
const eventObj = new myEventEmitter();
eventObj.on("error", function (e) {//如果不添加error的处理,程序将崩溃~
console.log("我处理了异常,异常内容:" + e);
});
eventObj.showErr();
/*Node.js 风格的回调
* 觉得官方例子不太好,一个抛异常,一个没抛,怎么比?总结一句话,try..catch无法捕捉到异步的异常操作*/
try {
fs.readFile('/some/file/that/does-not-exist', (err, data) => {
if (err) {// 假设的错误:在这里抛出
console.log(err.path) ;
}
});
} catch (err) {// 这不会捕获到抛出!
console.log(err);
}
/*Error 类
* 所有由 Node.js 产生的错误,包括所有系统的和 JavaScript 的错误都实例化自或继承自 Error 类。
*
* Error.captureStackTrace(targetObject[, constructorOpt])
* Error.stackTraceLimit
* 这两个类方法没看明白怎么用,以后再说吧~*/
/*error.stack
* error.stack 属性是一个字符串,描述代码中 Error 被实例化的位置。
* */
/*RangeError 类
* Error 的一个子类,表明一个函数的一个给定的参数的值不在可接受的集合或范围内;
* 无论是一个数字范围还是给定函数参数的选项的集合。
* ReferenceError 类
* Error 的一个子类,表明试图访问一个未定义的变量。 这些错误通常表明代码有拼写错误或程序已损坏。
* SyntaxError 类
* Error 的一个子类,表明程序不是有效的 JavaScript 代码。 这些错误是代码执行的结果产生和传播的。
* 代码执行可能产生自 eval、Function、require 或 vm。 这些错误几乎都表明程序已损坏。
* TypeError 类
* Error 的一个子类,表明提供的参数不是一个被允许的类型。*/
/*Error的对象属性
* error.code<String>:属性是一个表示错误码的字符串,总是 E 带上一串大写字母
* error.errno<String> | <Number>: 如果返回一个数值,则数值是一个负数,对应 libuv 错误处理 中定义的错误码。
* error.syscall<String>:error.syscall 属性是一个字符串,描述失败的 系统调用。下面的例子返回"open"
* error.path<String>:下面例子返回:/some/file/that/does-not-exist
* error.address<String>:针对网络
* error.port<Number>:针对网络*/
/*错误对象的内容
* { Error: ENOENT: no such file or directory, open '/some/file/that/does-not-exist'
at Error (native)
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/some/file/that/does-not-exist' }
*/
/*常见的系统错误
* 1,EACCES (拒绝访问): 试图以被一个文件的访问权限禁止的方式访问一个文件。
* 2,EADDRINUSE (地址已被使用): 试图绑定一个服务器(net、http 或 https)到本地地址,
* 但因另一个本地系统的服务器已占用了该地址而导致失败。
* 3,ECONNREFUSED (连接被拒绝): 无法连接,因为目标机器积极拒绝。 这通常是因为试图连接到外部主机上的废弃的服务。
* 4,ECONNRESET (连接被重置): 一个连接被强行关闭。 这通常是因为连接到远程 socket 超时或重启。
* 常发生于 http 和 net 模块。
* 5,EEXIST (文件已存在): 一个操作的目标文件已存在,而要求目标不存在。
* 6,EISDIR (是一个目录): 一个操作要求一个文件,但给定的路径是一个目录。
* 7,EMFILE (系统打开了太多文件): 已达到系统文件描述符允许的最大数量,且描述符的请求不能被满足直到至少关闭其中一个。
* 当一次并行打开多个文件时会发生这个错误,尤其是在进程的文件描述限制数量较低的操作系统(如 OS X)。
* 要解决这个限制,可在运行 Node.js 进程的同一 shell 中运行 ulimit -n 2048。
* 8,ENOENT (无此文件或目录): 通常是由 fs 操作引起的,表明指定的路径不存在,即给定的路径找不到文件或目录。
* 9,ENOTDIR (不是一个目录): 给定的路径虽然存在,但不是一个目录。 通常是由 fs.readdir 引起的。
* 10,ENOTEMPTY (目录非空): 一个操作的目标是一个非空的目录,而要求的是一个空目录。 通常是由 fs.unlink 引起的。
* 11,EPERM (操作不被允许): 试图执行一个需要更高权限的操作。
* 12,EPIPE (管道损坏): 写入一个管道、socket 或 FIFO 时没有进程读取数据。 常见于 net 和 http 层,表明远端要写入的流已被关闭。
* 13,ETIMEDOUT (操作超时): 一个连接或发送的请求失败,因为连接方在一段时间后没有做出合适的响应。
* 常见于 http 或 net。 往往标志着 socket.end() 没有被正确地调用。*/
还没有评论,来说两句吧...