Node.js異常(例外)處理
阿新 • • 發佈:2019-01-07
一、異常處理
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、執行
兩次結果是不一樣的!!