我有一个Javascript控件,可以加载包含HTML的页面和只有该页面需要的一些Javascript。
最初我在YAGNI / KISS假设下运作,并将所有Javascript保存在一个大的functions.js
文件中;但是现在页面数量已经增长,而且其中一些是需要稍微不同的相同功能实例化的变体。
所以我觉得能够写
非常有用 <div>...<button id="object123">Don't click me!</button>... </div>
<script>
$('#object123').on('click', function(){
alert("I said not to click!");
});
</script>
并加载
// All error checking omitted for clarity
$(divSelector).load('page-with-object-123.html');
鉴于我已经对ID等的唯一性进行了检查,如果脚本包含语法错误,则会出现问题。在那种情况下,当然执行会停止,但更重要的是,我在jQuery (.load
执行<script>
标记的位置)中收到错误。因此,不能立即将错误跟踪到原始HTML。
我我能够得到错误(就此而言,我的脚本中唯一的语法错误现在是有意的),但是我想抓住它以便优雅地处理它。
我用try/catch
try {
$(divSelector).load(sourceHTML);
} catch (err) {
alert("An error occurred in " + sourceHTML);
}
但错误并未被发现。 This answer会建议它应该是,除非jQuery对try / catch机制做了一些奇怪的事情。
我已根据this other answer的建议尝试使用window.onerror
。默认情况下,可以使用(即我全局定义onerror回调)。
此时我尝试在函数体本身进行更改,并在不再需要处理器时恢复处理程序。
虽然 出现曾经工作过一次(可能是因为我正在查看由于客户端缓存导致的旧代码的全球版本),但我似乎无法使其工作
在强制facepalm 之后
/**
* Effect a call
* @param string op* command
* @param dict data data to send
* @param callable callback function to be called on success
* @param callable onError function to be called on failure
*/
function poster(op, data, callback, onError) {
// Save handler
var origHandler = window.onerror;
// Install new error handler
window.onerror = function(message, url, lineNumber) {
alert(message + "\n" + url + "\n" + lineNumber);
return true;
};
$.post(
ajaxUrl,
$.extend({ op: op }, data),
function (responseText, statusText, jqXHR) {
// Evaluate the response for server error notifications
var todo = jqBadResponse(responseText) ? onError : callback;
// Edit: try using onerror to watch also callbacks.
// window.onerror = origHandler;
todo && todo(responseText);
// Restore error handler
window.onerror = origHandler;
}
).fail(function(jqXHR, title) { // Outer failure.
// Restore error handler
window.onerror = origHandler;
jqCheckFail(jqXHR, title); // Notify of the error
});
}
我知道what my basic problem is ...我 知道的是 在这种情况下。
答案 0 :(得分:0)
通常的副作用是仔细检查在Stack Overflow上发布明智问题的要求 - 你偶然发现了答案。
正如我所说,我使用函数将HTML加载到DIV中。但是现在使用上面的函数我的方式不同。实际的分配不再由.load()
中的jQuery完成,而是由我自己的回调完成。
jQuery将解释Javascript并在.html()
调用中抛出一个SyntaxError ,而不再在.load()
调用中抛出。在.load
函数中,加载的HTML代码只是一个字符串,它包含的语法错误将被忽略。
当我告诉jQuery将该字符串视为HTML并将其放在DOM中以引发异常时。当我在.post
函数内部时发生 ,但它在范围内发生了更远。
我仍然不太明白为什么外try {}
未能抓住它,但我有理由相信这可能与
try (
var a = ...*some Promise whose payload will be executed sometime in the near future*...
} catch (e) {
// Here I catch the error and there is no error;
// the Promise did promise the impossible, but that
// offer hasn't been picked up yet.
}
...
// NOW finally the Promise executes and throws. But I'm no longer inside
// a try/catch block.
确实,如果我将try / catch放在同步块中
poster(
'form',
{
code: ...,
id: ...
},
function (responseText) {
try {
$('#details').html(responseText.data.html);
} catch(e) {
alert("GOTCHA");
return;
}
...
}
);
正确捕获了异常。