1

在 Web 应用程序开发中,我想要一种一致的方式来捕获和报告错误情况。例如,数据库更新例程可能会检测到各种错误情况,理想情况下,我希望应用程序能够捕获它们并优雅地报告。下面的代码不起作用,因为抛出错误时未定义 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;
}
}

GAS 是否有一个好的或最佳实践?

4

1 回答 1

2

要拥有一个完整的错误对象,message您必须使用堆栈跟踪来构建一个,而不仅仅是抛出一个字符串。例如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 ...");
}
于 2012-11-22T20:51:30.460 回答