如何传递错误条件

时间:2012-11-22 20:39:24

标签: google-apps-script

在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吗?

1 个答案:

答案 0 :(得分:2)

要拥有一个完整的错误对象,使用message和stacktrace,你必须构建一个,而不只是抛出一个字符串。例如throw new Error("DB error ...");

现在,我通常实现的更“一致”的方法是将所有客户端调用包装成一个能为我处理任何错误的函数。 e.g。

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 ...");
}