Javascript 这个未知错误来自何处,如何防止?

Javascript 这个未知错误来自何处,如何防止?,javascript,http,google-apps-script,web-applications,uncaught-exception,Javascript,Http,Google Apps Script,Web Applications,Uncaught Exception,已解决 感谢所有帮助我跟踪此错误的人,使用Firefox中的调试器,此错误称为“错误:超出了最大执行时间” 希望这个问题能对以后的人有所帮助。 我希望有人能解释这一未可知的错误,并告诉我如何防止它 我正在为图书馆开发一个系统,使用谷歌应用程序脚本获取使用情况报告,我们的系统目前已成功地将报告导入谷歌硬盘。然而,最近,当我们测试捕获所有函数时,控制台中出现了一条未知错误消息,没有任何指示它是什么类型的错误,并且显示了一条并非来自代码的路径。我想知道有没有人遇到过这个错误?有什么解释吗?如何预防呢

已解决 感谢所有帮助我跟踪此错误的人,使用Firefox中的调试器,此错误称为“错误:超出了最大执行时间” 希望这个问题能对以后的人有所帮助。

我希望有人能解释这一未可知的错误,并告诉我如何防止它

我正在为图书馆开发一个系统,使用谷歌应用程序脚本获取使用情况报告,我们的系统目前已成功地将报告导入谷歌硬盘。然而,最近,当我们测试捕获所有函数时,控制台中出现了一条未知错误消息,没有任何指示它是什么类型的错误,并且显示了一条并非来自代码的路径。我想知道有没有人遇到过这个错误?有什么解释吗?如何预防呢

如果不将报告上载到Google驱动器,此代码实际上可以正常工作,但一旦我用
解析器钩住我的函数,并将解析后的报告上载到Google驱动器,就会发生此错误。
(英语不是我的第一语言,如果我的表达引起任何混乱,我很抱歉)
以下是html代码:

<!DOCTYPE html>
<html>
<head>
    <!--import libraries-->
    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>

/....../(load CSS, scripts)

<div data-role="page" id="main">
/....../(headers, navibar)

<div class='row'>
        <div class="column">
            <div class='row'>
                <h2>Harvest All</h2>
                <p>
                    <button type="submit" class='btn-harvest-vendor'>
                        <i class="material-icons" id="all">get_app</i>
                    </button>
                </p>
            </div>
        <div class="column">
            <div data-role="link" class="ui-content">
                <h2><a id="error-report" href="#error-dialog">Error Report</a></h2>
            </div>
        </div>
    </div>

    <div class='row' id='statusTable'>
        <h2>Vendor Finder</h2>
        <table id="status">
            /....../(loading status table with template, I know it's not idea, but I had an issue with using an asynchronous function to create the table back then.)
        </table>
    </div>
</div>

<!--create error report dialog content-->
<div data-role="page" data-dialog="true" id="error-dialog">
    <div data-role="header">
        <h1>Error Report</h1>
    </div>

    <div data-role="main" class="ui-content">
        <p id="errors"></p>
    </div>

    <div data-role="footer">
        <h1>Remember to refresh the page for updated status!</h1>
    </div>
</div>


<script>
    /** determines which function gets called in scripts.html */
    $('.btn-harvest-vendor').on('click', btnClassVendor).promise();
    $('.btn-retry-report').on('click', btnClassReport).promise();
</script>

</body>
</html>
而在服务器中,由于
vendorName
type
harvestvendornlist
的参数)都是
未定义的
。它将转到代码的
部分,以浏览供应商列表。在调用
parseSelect()
之后,我无法提供任何内容,因为在那之后将是我队友的代码,我对这些组件不熟悉。我知道这是远远不够的信息,但我现在真的不能提供更多。如果以后我可以添加更多的细节,我会继续张贴在这里。现在,如果信息太少,很抱歉

function harvestVendorList(vendorName, type) {
    var vendorSpreadsheet = SpreadsheetApp.openByUrl(vendorListUrl).getSheets()[0];
    var statusSpreadsheet = SpreadsheetApp.openByUrl(reportStatusUrl).getSheets()[0];
    var statusHeaders = statusSpreadsheet.getRange(1, 1, 1, statusSpreadsheet.getLastColumn()).getValues()[0];
    var vendorList = ObjApp.rangeToObjects(vendorSpreadsheet.getDataRange().getValues());
    var statusList = ObjApp.rangeToObjects(statusSpreadsheet.getDataRange().getValues());
    errors = "<p>";
    if (vendorName) {
        /....../(code for harvesting a vendor or a specific report)
    }
    else {
        for (var i in vendorList) {
            Logger.log("harvesting, vendor:" + vendorList[i].vendor);
            /** call function to harvest vendor */
            harvestVendor(vendorList[i], statusList[i]);
            Logger.log(i + " DONE!");
        }
    }
    /....../(code for writing updated status back to the google sheet)
    errors += "</p>";
    return errors;
}
function harvestVendor(vendor, status) {
    var date = new Date();
    var year = date.getYear();
    var month = date.getMonth();
    /** get vendor name for logging error message */
    var vendorName = vendor.vendor;
    for (var i in vendor) {
        if (i != "rowNum" && i != "vendor" && vendor[i]) {
            var requestUrl = createURL(vendor[i], year, month);
            var reportType = i.toUpperCase();
            try {
                var data = harvest(requestUrl);
                if (data[0] == 0) {
                    errors += (error messages);
                    status[i] = 0;
                    continue;
                }
                if (data[0] == 3) {
                    errors+=(error messages);
                    status[i] = 0;
                    continue;
                }
                if (data[0] == 2) {
                    errors+=(error messages);
                    status[i] = 0;
                    continue;
                }
            }
            catch (e) {
                errors += (error messages);
                continue;
            }
            status[i] = 1;

/**this is the parsing funcions*/

            try {
                parseSelect(data[1], vendorName, getPeriod());
            }
            catch (e) {
                errors += (error messages);
                status[i] = 2;
                continue;
            }
            /....../(checking exceptions)
            /** set 1 sec period between each harvest */
            Utilities.sleep(1000);
        }
    }
    status.last = Utilities.formatDate(date, "GMT", "yyyy.MM.dd");
}
function harvest(request) {
    var response = UrlFetchApp.fetch(encodeURI(request), { muteHttpExceptions: true });
    var content = response.getContentText();

    var returnType;

    try {
        /**checking returning types*/
        if(response valid)
            returnType=1;
        /**response is an array*/
        else if(content.substring(0,1) == "[" )
            returnType=2
        /**response is an object*/
        else if(content.substring(0,1)=="{")
            returnType=3;
        /**if the response is not valid*/
        else
            returnType=0;
    }
    /**if any exception happens*/
    catch(e){Logger.log(e);}

    /**if the response is valid*/
    if (returnType > 0)
        var data = JSON.parse(content);
    Logger.log("return type: " + returnType);
    /**store the type and data in an array*/
    var result = [returnType, data];
    return result;
}
控制台:

更新:
添加withFailureHandler(函数(e){console.error(e)})后,控制台中的错误更改为:
错误来自此

感谢所有帮助我跟踪此错误的人。 对于Firefox中的调试器,该错误称为“错误:超出了最大执行时间。”
由于某些原因,该错误不会显示在Chrome控制台中。
另一种跟踪方法是使用view>execution跟踪项目中运行的每个函数。

我希望这能帮助那些后来在谷歌应用程序脚本开发中遇到同样问题的人。

评论不用于进一步讨论;这段对话已经结束。
var btnClassVendor = function(e){
google.script.run.withSuccessHandler(onSuccessVendor).harvestVendorList(e.currentTarget.id,null);
}
function harvestVendorList(vendorName, type) {
    var vendorSpreadsheet = SpreadsheetApp.openByUrl(vendorListUrl).getSheets()[0];
    var statusSpreadsheet = SpreadsheetApp.openByUrl(reportStatusUrl).getSheets()[0];
    var statusHeaders = statusSpreadsheet.getRange(1, 1, 1, statusSpreadsheet.getLastColumn()).getValues()[0];
    var vendorList = ObjApp.rangeToObjects(vendorSpreadsheet.getDataRange().getValues());
    var statusList = ObjApp.rangeToObjects(statusSpreadsheet.getDataRange().getValues());
    errors = "<p>";
    if (vendorName) {
        /....../(code for harvesting a vendor or a specific report)
    }
    else {
        for (var i in vendorList) {
            Logger.log("harvesting, vendor:" + vendorList[i].vendor);
            /** call function to harvest vendor */
            harvestVendor(vendorList[i], statusList[i]);
            Logger.log(i + " DONE!");
        }
    }
    /....../(code for writing updated status back to the google sheet)
    errors += "</p>";
    return errors;
}
function harvestVendor(vendor, status) {
    var date = new Date();
    var year = date.getYear();
    var month = date.getMonth();
    /** get vendor name for logging error message */
    var vendorName = vendor.vendor;
    for (var i in vendor) {
        if (i != "rowNum" && i != "vendor" && vendor[i]) {
            var requestUrl = createURL(vendor[i], year, month);
            var reportType = i.toUpperCase();
            try {
                var data = harvest(requestUrl);
                if (data[0] == 0) {
                    errors += (error messages);
                    status[i] = 0;
                    continue;
                }
                if (data[0] == 3) {
                    errors+=(error messages);
                    status[i] = 0;
                    continue;
                }
                if (data[0] == 2) {
                    errors+=(error messages);
                    status[i] = 0;
                    continue;
                }
            }
            catch (e) {
                errors += (error messages);
                continue;
            }
            status[i] = 1;

/**this is the parsing funcions*/

            try {
                parseSelect(data[1], vendorName, getPeriod());
            }
            catch (e) {
                errors += (error messages);
                status[i] = 2;
                continue;
            }
            /....../(checking exceptions)
            /** set 1 sec period between each harvest */
            Utilities.sleep(1000);
        }
    }
    status.last = Utilities.formatDate(date, "GMT", "yyyy.MM.dd");
}
function harvest(request) {
    var response = UrlFetchApp.fetch(encodeURI(request), { muteHttpExceptions: true });
    var content = response.getContentText();

    var returnType;

    try {
        /**checking returning types*/
        if(response valid)
            returnType=1;
        /**response is an array*/
        else if(content.substring(0,1) == "[" )
            returnType=2
        /**response is an object*/
        else if(content.substring(0,1)=="{")
            returnType=3;
        /**if the response is not valid*/
        else
            returnType=0;
    }
    /**if any exception happens*/
    catch(e){Logger.log(e);}

    /**if the response is valid*/
    if (returnType > 0)
        var data = JSON.parse(content);
    Logger.log("return type: " + returnType);
    /**store the type and data in an array*/
    var result = [returnType, data];
    return result;
}
function Md(a, b) {
        b = Error(b);
        b.name = a;
        return b
}