【问题标题】:Catch a javascript exception in onError event (webkitspeech recognition)在 onError 事件中捕获 javascript 异常(webkitspeech 识别)
【发布时间】:2014-11-03 18:36:52
【问题描述】:

按照code of the Webkit Speech Recognition(查看源代码),我想在启动时(例如当您拒绝浏览器使用麦克风时)捕获错误以执行其他操作。

问题是……我不知道如何抓住这个错误之王。

最终目标是将错误消息传递给尝试启动 Webkit 语音识别的对象。因此,如果您有另一个(好的)解决方案来做到这一点。

我有这样的关系:

var anObject= {
    recognizer : Recognizer,

    listen : function() {
        try{
            this.recognizer.listen();
        } catch (error) {
            alert('I want to do something here with the error');
        }
    }
}


var Recognizer = {


    listen: function()
    {
        var recognition = new webkitSpeechRecognition();
        // recognition config

        try{
            recognition.start();
        } catch (error) {
             alert(error);
             // I've also tried "throw error;" but we never pass in this catch 
        }

        recognition.onerror = function(event) {
            console.log(event.error); // this works

            throw event.error; // the "exception" is thrown 
        }

        // other functions
    }
}

这不起作用,我不知道为什么。我得到了一个“未捕获的异常”,所以抛出了异常,但没有被捕获。

感谢您的帮助。

【问题讨论】:

    标签: javascript exception webkit speech-recognition


    【解决方案1】:

    您的两个示例代码都不起作用,因为 onerror 是异步调用的,并且没有被您的 catch 或条件语句捕获。

    发生错误时调用的函数的上下文是 SpeechRecognition 对象,而不是您尝试捕获它的对象...最好的办法是从 onerror 函数中调用处理错误的对象。

    这应该可行:

    var Recognizer = {
        listen: function()
        {
            var recognition = new webkitSpeechRecognition();
    
            recognition.onerror = function(event) {
                anObject.catchError(event);
            }
    
            recognition.start();
        }   
    }
    
    var anObject= {
        recognizer : Recognizer,
    
        listen : function() {
            this.recognizer.listen();
        },
    
        catchError: function(event) {
          switch (event.error) {
            case 'network':
              console.log('network error');
              break;
            case 'not-allowed':
            case 'service-not-allowed':
              console.log('permission denied by user or browser');
              break;
          }
        }
    }
    
    anObject.listen();
    

    没有自动的方法来检测用户拒绝权限、浏览器拒绝权限,甚至是没有麦克风的用户之间的区别。

    查看annyang Speech Recognition library,它使用一些额外的逻辑来找出不同的错误原因。它还解决了使用语音识别的所有其他难题,绕过了可能导致浏览器崩溃的潜在错误,并使语音识别的使用更加简单:https://www.talater.com/annyang/

    【讨论】:

    • 谢谢,但实际上您并没有更改代码,是吗?您已经用开关替换了一些逻辑。这部分工作正常,因为我可以检测到错误。我已经更新了我的问题以指定 onError 中的 console.log 正在工作。我的问题是将错误传递给父对象。我还更新了我的问题,以解释我希望拥有的那种关系。
    • 这是您的代码的异步性质问题,而不是语音识别问题。您最好的选择是调用一个全局对象来处理识别错误事件中的错误。我会用代码更新上面的答案。
    • 我想我可以用window.onError处理错误,但我没有记错,所有错误都会被处理。不是很好(但如果没有解决方案,我会尝试这个)
    猜你喜欢
    • 2018-06-04
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2016-11-25
    • 2012-11-12
    相关资源
    最近更新 更多