Si trato de reproducir un archivo de audio que no existe (por ejemplo, el archivo aún no se ha descargado) como este:
audio_object = new Audio("Non_Existing_Audio_File.mp3"); audio_object.play();Yo obtengo:
Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable.Eso está bien, pero ¿cómo puedo detectar ese error? Si hago un intento/captura, esto es lo que sucede:
function playAudioWithTryCatch() { try { audio_object.play(); //Result: Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable. } catch (error) { // We never get here: console.error("Audio play failed",error); } }Entonces, con try/catch, nunca llego al bloque catch, solo aparece el mismo mensaje de error no controlado cuando se llama al método de reproducción.
Si trato de usar una Promesa obtengo:
function playAudioWithPromise(){ let myPromise = new Promise(function(resolve, reject) { if (E2.play()) { resolve("OK"); } else { reject("Error"); } }); myPromise.then( result => console.log(result), error => console.log(error) ); //Result: Uncaught (in promise) DOMException: The media resource indicated by the src attribute or assigned media provider object was not suitable. //And "OK" (console log) }Nuevamente, el error no se detecta, similar al anterior.
¿Alguien puede decirme cómo detectar/manejar este error antes de que se envíe a la consola?
Sé que puedo usar la propiedad readyState de medios, pero eso no ayuda en este caso, ya que estoy tratando de solucionar un problema de Safari en el que readyState no se muestra listo hasta que un usuario haya iniciado todos y cada uno de los métodos de reproducción de archivos de audio. lo cual no es práctico, así que no puedo usar eso aquí.
¡Cualquier ayuda apreciada!
audio_object.play() devuelve una promesa. Atrapa el error con un .catch() como una promesa normal. Lo descubrí probando el siguiente código e inspeccionando las variables en mi navegador:
function start() { audio_object = new Audio("Non_Existing_Audio_File.mp3"); window.playResult = audio_object.play(); playResult.catch(e => { window.playResultError = e; }) } start();