2012-11-22 35 views
1

在Web應用程序開發中,我想要一致的方式來捕獲和報告錯誤條件。例如,數據庫更新例程可以檢測各種錯誤條件,理想情況下我希望應用程序捕獲它們並正常報告。下面din't工作的代碼,因爲當被拋出錯誤retdiag未定義...如何通過錯誤條件

function saveData(app,e) { 
var db ; 
var retdiag = ""; 
var lock = LockService.getPublicLock(); 
lock.waitLock(30000); 
try { 
// e.parameters has all the data fields from form 
// re obtain the data to be updated 
db = databaseLib.getDb(); 
var result = db.query({table: 'serviceUser',"idx":e.parameter.id}); 
if (result.getSize() !== 1) { 
throw ("DB error - service user " + e.parameter.id); 
} 
//should be one & only one 
retdiag = 'Save Data Finished Ok'; 
} 
catch (ex) { 

retdiag= ex.message // undefined! 
} 
finally { 
lock.releaseLock(); 
return retdiag; 
} 
} 

是否有一個很好的或最好的做法是氣?

回答

2

要有一個完整的錯誤對象,使用message和stacktrace,你必須建立一個,而不只是拋出一個字符串。例如throw new Error("DB error ...");

現在,我通常實現的一個更「一致」的方式是將我所有的客戶端調用包裝成一個函數,以便爲我處理任何錯誤。例如

function wrapper_(f,args) { 
    try { 
    return f.apply(this,args); 
    } catch(err) { 
    ;//log error here or send an email to yourself, etc 
    throw err.message || err; //re-throw the message, so the client-side knows an error happend 
    } 
} 

//real client side called functions get wrapped like this (just examples) 
function fileSelected(file,type) { return wrapper_(fileSelected_,[file,type]); } 
function loadSettings(id) { return wrapper_(loadSettings_,[id]); } 

function fileSelected_(file,type) { 
    ; //do your thing 
} 

function loadSettings_(id) { 
    ; //just examples 
    throw new Error("DB error ..."); 
} 
+0

感謝您分享您的專業知識。 – DavidF

+0

謝謝。只需寫「err.message || err」就可以完成工作:) – jrosell