我注意到,当Google Apps脚本中的try / catch块中出现错误时,Logger.log(e instanceof Error)
返回true。但是,当同一个对象在catch
语句中传递回客户端时,它会记录false
。
GAS示例
function isValid() {
return false
}
function testing() {
try {
if(!isValid()) { throw new Error("failure") }
return "success"
} catch(e) {
Logger.log(e instanceof Error) // true
return e // false in the client when tested with console.log(e instanceof Error)
}
}
客户端
function foo() {
google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).testing();
}
function onSuccess(e) {
console.log(e instanceof Error) // false
console.log(e) // null
}
function onFailure(e) {
console.log(e instanceof Error) // no result
}
有没有更好的方法来测试脚本文件返回的错误?
答案 0 :(得分:1)
在客户端,您在调用.run.myFunction()
代码时使用.withFailureHandler(...)
。失败处理程序是客户端代码中的一个函数,如果在服务器端代码中抛出异常(即错误)而未处理,则会调用该函数。
只有在抛出异常时才会调用失败处理程序。否则,成功处理程序将接收服务器端函数的return
值。
.GS
function myFn() {
try {
throw new Error("failure");
}
catch (e) {
Logger.log(e);
// Must rethrow to activate the client's FailureHandler function.
throw e;
}
return "success"
}
html的
function foo() {
google.script.run.withFailureHandler(logError).withSuccessHandler(useReturnValue).myFn();
}
function logError(error) {
console.log(error);
}
function useReturnValue(value) {
// do stuff
}
在客户端控制台中,您将看到记录错误。
答案 1 :(得分:0)
问题是您的e
变量没有分配对象。请注意,官方指南使用error
作为错误处理函数参数,但您的代码使用data
,而不是在您使用e
的控制台语句中使用它。
在客户端代码中,将data
替换为e
,反之亦然。
来自https://developers.google.com/apps-script/guides/html/reference/run#withFailureHandler(Function)
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function getUnreadEmails() {
// 'got' instead of 'get' will throw an error.
return GmailApp.gotInboxUnreadCount();
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function onFailure(error) {
var div = document.getElementById('output');
div.innerHTML = "ERROR: " + error.message;
}
google.script.run.withFailureHandler(onFailure)
.getUnreadEmails();
</script>
</head>
<body>
<div id="output"></div>
</body>
</html>