try..catch
多用于捕捉同步方法中的抛出错误,但不能用 try..catch 捕捉异步方法中抛出 de 错误
如:
- var http = require('http')
- try{
- http.createServer(function(req,res){
- if(req.url!="/favicon.ico"){
- noneexist();//不存在本函数
- res.writeHead(200,{'Content-Type':'text/html'})
- res.write('<head><meta charset="utf-8"/></head>')
- res.end('你好\n')
- }
- }).listen(8000,"127.0.0.1")
- }
- catch(err){
- console.log('接收客户端请求时发生以下错误:')
- console.log(err.code)
- }
在用浏览器请求时,会出错,因为 noneexist() 不存在,程序也会停止运行
- $ node app.js
- D:\Users\yuan\Desktop\app.js:6
- noneexist();//不存在本函数
- ^
- ReferenceError: noneexist is not defined
- at Server.<anonymous> (D:\Users\yuan\Desktop\app.js:6:13)
- at emitTwo (events.js:125:13)
- at Server.emit (events.js:213:7)
- at parserOnIncoming (_http_server.js:602:12)
- at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
为了防止程序被强制关闭,提供了一个 uncaughtException 事件,用于捕捉及处理任何未被处理的错误
可将代码改成如下形式:
- var http = require('http')
- var http = require('http')
- http.createServer(function(req,res){
- if(req.url!="/favicon.ico"){
- noneexist();//不存在本函数
- res.writeHead(200,{'Content-Type':'text/html'})
- res.write('<head><meta charset="utf-8"/></head>')
- res.end('你好\n')
- }
- }).listen(8000,"127.0.0.1")
- process.on('uncaughtException',function(err){
- console.log('接收客户端请求时发生以下错误:')
- console.log(err)
- })
运行结果如下会报错,但不会停止:
- $ node app.js
- 接收客户端请求时发生以下错误:
- ReferenceError: noneexist is not defined
- at Server.<anonymous> (D:\Users\yuan\Desktop\app.js:6:13)
- at emitTwo (events.js:125:13)
- at Server.emit (events.js:213:7)
- at parserOnIncoming (_http_server.js:602:12)
- at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
- |
但这种方法可能会出现资源泄露,因此利用 domain 模块进行处理错误,代码如下:
- var http = require('http')
- var domain = require('domain')
- http.createServer(function(req,res){
- var d = domain.create()
- d.once('error',function(err){
- res.writeHead(200,{'Content-Type':'text/html'})
- res.write('<head><meta charset="utf-8"/></head>')
- res.write('服务器接收客户端请求时发生以下错误: ')
- res.end(err.message)
- })
- d.run(function(){
- if(req.url!=="/favicon.ico"){
- nonexist();
- res.writeHead(200,{'Content-Type':'text/html'})
- res.write('<head><meta charset="utf-8"/></head>')
- res.end('你好\n')
- }
- })
- }).listen(8000,"127.0.0.1")
浏览器访问后在浏览器中会出现错误信息,程序不会间断
下面详细介绍 Domain
- domain.on('error',function(err){
- //事件回调函数代码
- })
- domain。run(fn)//fn为一函数
eg:
- var domain = require('domain')
- var fs = require('fs')
- var d = domain.create()
- d.name = 'dl'
- d.on('error',function(err){
- console.error(d.name,err)
- })
- d.run(function(){
- process.nextTick(function(){
- setTimeout(function(){
- fs.open('non-existent file','r',function(err,fd){
- if(err)throw err
- })
- },1000)
- })
- })
输出结果为:
- $ node app.js
- dl { Error: ENOENT: no such file or directory, open 'D:\Users\yuan\Desktop \non-existent file'
- errno: -4058,
- code: 'ENOENT',
- syscall: 'open',
- path: 'D:\\Users\\yuan\\Desktop\\non-existent file',
- domain:
- Domain {
- domain: null,
- _events: { error: [Function] },
- _eventsCount: 1,
- _maxListeners: undefined,
- members: [],
- name: 'dl' },
- domainThrown: true }
当使用 Domain 对象的 run 方法指定所有监听的函数时,函数中使用的实例对象都隐式地绑定到 Domain 对象上。有时需要某些对象不绑定 Domain 上,或者绑定到另一个 Domain 上,因此需要显性绑定,利用 add 方法
- domain.add(emitter)
可通过下面例子说明,我们创建一个 Http 服务器,并指定服务器接收到的客户端请求时,首先创建一个 Domain 对象,然后使用该对象的 add 方法分别将用于读取客户端请求数据的 http.IncomingMessage 对象,与用于发送服务器端响应数据的 http.ServerRespanse 对象绑定到 Domain 对象上,并制定当 Domain 对象那个捕获到错误时客户端返回错误信息。
- var http = require('http')
- var domain = require('domain')
- http.createServer(function(req,res){
- var d = domain.create();
- d.add(req)
- d.add(res)
- d.on('error',function(err){
- res.writeHead(200)
- res.write('服务器接收客户端请求时发生以下错误: ')
- res.end(err.message)
- })
- res.writeHead(200)
- req.on('data',function(){
- bibeexists();
- res.write('你好')
- res.end()
- })
- }).listen(8000)
接下来创建一个用于向 Http 服务器提供请求的模块文件代码
- var http = require('http')
- var options = {
- hostname:'localhost',
- port:8888,
- path:'/',
- method:'POST'
- }
- var req = http.request(options,function(res){
- res.setEncoding('utf8')
- res.on('data',function(chunk){
- console.log('响应内容:' + chunk)
- })
- })
- req.write('你好')
- req.end('再见')
分别在不同界面运行以上两个程序,可得,服务器不停止工作,http 请求端返回错误数据:
- [root@kuber2 webproject]# node client.js
- 响应内容:服务器接收客户端请求时发生以下错误:
- 响应内容:noneexists is not defined
- [root@kuber2 webproject]#
使用了 add 方法绑定了 Domain,可以使用 remove 方法解绑,即
- domain.remove(emitter)
来源: http://www.cnblogs.com/yuanchenghao/p/7428327.html