在onError事件中捕获javascript异常(webkitspeech识别)

时间:2014-11-03 18:36:53

标签: javascript exception webkit speech-recognition

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
    }
}

这不起作用,我不知道为什么。我得到了一个" Uncaught exception"所以异常被抛出,但没有被抓住。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您的两个示例代码都无法正常工作,因为异步调用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/