2014-11-03 76 views
1

code of the Webkit Speech Recognition(请参阅源代码)之后,我想在启动时发现错误(例如,当您拒绝浏览器使用麦克风时)执行其他操作。在onError事件(webkitspeech识别)中捕获javascript异常

问题是......我不知道如何捕捉这个错误之王。

最终目标是将错误消息传递给尝试启动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 
    } 
} 

这是不行的,我不知道为什么。我得到了一个“未捕获的异常”,因此引发异常,但未捕获。

感谢您的帮助。

回答

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/

+0

感谢但实际上您没有更改代码,是吗?你用交换机取代了一些逻辑。这部分工作正常,因为我可以检测到错误。我已更新我的问题,以指定onError中的console.log正在工作。 我的问题是将错误传递给父对象。 我也更新了我的问题来解释我想要的那种关系。 – 2014-11-04 07:17:23

+0

这是您的代码的异步性问题,而不是语音识别。 最好的办法是调用一个全局对象来处理识别错误事件中的错误。我将用代码更新上面的答案。 – 2014-11-04 12:15:23

+0

我想我可以用window.onError来处理错误,但我没有错,所有的错误都会被处理。这不是很好(但如果没有解决方案,我会试试这个) – 2014-11-04 17:29:24