2014-11-03 40 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