1. 程式人生 > >Node.js異常(例外)處理

Node.js異常(例外)處理

一、異常處理

1、比如輸入瀏覽器的路由的時候,當路由輸入一個不存在的路徑的時候,這個時候就會直接報錯,報錯之後server就會崩潰,然後就要手動啟動服務,對於一個伺服器而言是不能容忍的。這個時候就要用到異常處理。

2、分類

    同步異常處理

    非同步異常處理

二、同步的異常處理

(一)、輸入正確的路由

1、n9

var http  = require('http');                                        
var url = require('url');        
var luyou = require('./luyou');    
http.createServer(function  (request,response){                                        
              if(request.url!=="/favicon.ico"){ //清除第2此訪問                
					pathname=url.parse(request.url).pathname;        
					pathname = pathname.replace(/\//,'');//替換掉前面的/        
					try{        
                       luyou[pathname](request,response);    
				
					}catch(err){    //回撥函式    
						console.log('aaaaa='+err);    
						response.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'});        
						response.write(err.toString());        
						response.end('');
				}
                        console.log("server執行完畢");
                                                                                        }                                        
}).listen(8000);                                        
console.log('Server running  at http://127.0.0.1:8000/');

2、執行



(二)、輸入不正確的路由



三、非同步的異常處理

只需要修改兩處:

1、假設 luyou

var optfile = require('./models/optfile');
//封裝
function getRecall(req ,res ){
	res.writeHead(200,  {'Content-Type':  'text/html;  charset=utf-8'});
	function recall(data){
			res.write(data);
			res.end('');//不寫則沒有http協議尾
	}
	return recall;
}

module.exports={
	//進入
    login:function(req,res){
    recall =getRecall(req ,res);
    optfile.readfile('..../views/login.html'
,recall); //路徑寫錯 }, //註冊 setin:function(req,res){ recall =getRecall(req ,res); optfile.readfile('./views/setin.html',recall); }, //寫入 writefile:function(req ,res){ recall =greRecall(req ,res); optfile.writefile('./views/one.text','天氣好好!!!',recall); }, //讀圖片 showimg:function(req ,res){ res.writeHead(200, {'Content-Type':'image/jpeg'}); optfile.readImg('./imgs/pig.png',res); } }

2、optfile

var  fs=  require('fs');
module.exports={
	//讀檔案
	readfileSync:function(path){      //同步讀取
		//讀路徑
        var  data  =  fs.readFileSync(path,'utf-8');
        console.log(data);
        console.log("同步方法執行完畢");                
    },
    readfile:function(path,recall){          //非同步執行
        fs.readFile(path,function(err,data){
			//如果錯誤err
            if(err){
              console.log("nnnn:"+err);
	      recall("檔案不存在");  //新增
            }else{
              console.log(data.toString());
	      recall(data);
            }
        });
        console.log("非同步方法執行完畢");
    },
	
	//讀取二進位制圖片(傳入路徑)
	readImg:function(path,res){
        fs.readFile(path,'binary',function(err,filedata)  { //非同步執行  'binary' 二進位制流的檔案
            if  (err)  {
                console.log(err);
                return;
            }else{
				res.write(filedata,'binary');
				res.end();
            }
        });
    },
	
	//寫檔案
    writefile:function(path,data,recall){    //非同步方式
        fs.writeFile(path,  data,  function  (err)  {
            if  (err)  {
                throw  err;
            }
            console.log('It\'s  saved!');  //檔案被儲存
			recall('寫檔案成功!');
          });
    },
    writeFileSync:function(path,data){  //同步方式
        fs.writeFileSync(path,  data);
        console.log("同步寫檔案完成");
    },	
}

3、執行



============================================================================

四、異常的丟擲 -- throw (丟擲字串、物件、陣列等)

用try-catch 拿到丟擲的異常,作為廉價的訊息傳遞機制 。

1、exception


module.exports={      
    expfun:function(flag){      
        if(flag==0){      
            throw  '我是例外';      
        }      
        return  "success";      
    }      
}

2、n9修改

var http  = require('http');                                        
var url = require('url');        
var luyou = require('./luyou');    
var exception = require('./models/Exception');
http.createServer(function  (request,response){                                        
              if(request.url!=="/favicon.ico"){ //清除第2此訪問                
		    pathname=url.parse(request.url).pathname;        
		    pathname = pathname.replace(/\//,'');//替換掉前面的/        
		    try{        
                       //luyou[pathname](request,response);    
			data  =  exception.expfun(0);
			response.write(data);
			response.end('');
		    }catch(err){        
			console.log('aaaaa='+err);    
			response.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'});        
			response.write(err.toString());        
			response.end('');
		}
                      console.log("server執行完畢");
                                                                                        }                                        
}).listen(8000);                                        
console.log('Server running  at http://127.0.0.1:8000/');

3、執行



4、或者n9修改為

var http  = require('http');                                        
var url = require('url');        
var luyou = require('./luyou');    
var exception = require('./models/Exception');
http.createServer(function  (request,response){                                        
              if(request.url!=="/favicon.ico"){ //清除第2此訪問                
		    pathname=url.parse(request.url).pathname;        
		    pathname = pathname.replace(/\//,'');//替換掉前面的/        
		    try{        
                       //luyou[pathname](request,response);    
			data  =  exception.expfun(10);
			response.write(data);
			response.end('');
		    }catch(err){        
			console.log('aaaaa='+err);    
			response.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'});        
			response.write(err.toString());        
			response.end('');
		}
                      console.log("server執行完畢");
                                                                                        }                                        
}).listen(8000);                                        
console.log('Server running  at http://127.0.0.1:8000/');

5、執行



兩次結果是不一樣的!!