2016-04-18 9 views
5

Il seguente codice potrebbe mai generare un errore?I browser possono generare errori durante il tentativo di creare un contesto di rendering?

var canvas = document.createElement("canvas"); 

var ctx = canvas.getContext("somethingwrong"); 

In cromo, restituisce solo null.

Come sarebbe se il contesto di rendering richiesto fosse noto a un browser? (Come "webgl" o "experimental-webgl") Esiste la possibilità di un'eccezione di errore? In cromo non potrei provocare questo comportamento.

In altre parole: devo avvolgere questo codice in un try/catch in una libreria che controlla in modo pulito un contesto di rendering?

C'è forse un modo per oggettivare questo? Per esempio. da un servizio Web che cerca un codice tagliato in diversi browser e ne elenca i risultati potenzialmente diversi.

+0

Sì, anche per me sembra così. Ma potrebbe esserci un browser che supporta contesti "2d" e nessun altro. Ma anche quando disattivo webgl, ottengo null come valore di ritorno. Con la creazione, non sono sicuro se ci possa essere un'eccezione, dal momento che document.createElement ("qualcosa") per me restituisce undefined senza eccezioni. –

+0

non un duplicato ma correlato, http://stackoverflow.com/questions/36565598/webglcontextcreationerror-event-is-it-triggered-synchronously/36566263#36566263 Inoltre, il fatto che questo evento esista significa sì, browser ** può ** lanciare un errore. – Kaiido

+1

Grazie per il link. Sapevo dell'evento "webglcontextcreationerror". Non sono sicuro al 100% per cento della terminologia qui, ma direi che non si tratta di un errore, dal momento che non riesco a prenderlo (con try/catch) in un altro posto. Direi, questo è un evento regolare, che è chiamato occasionalmente "... errore". Ma per favore, qualcuno mi corregga, se sbaglio qui, –

risposta

2

Tornando null è la expected behavior se il contesto richiesto non è disponibile, o se la tela è già stato assegnato a un diverso tipo di contesto:

Restituisce null se il dato ID contesto non è supportata, se la tela è già stata inizializzata con l'altro tipo di contesto (ad esempio, provare per ottenere un contesto "2d" dopo aver ottenuto un contesto "webgl").

ci sono casi particolari in cui un'eccezione può essere lanciata correlate a scenari di proxy (ibid):

genera un'eccezione InvalidStateError se sono stati utilizzati i setContext() o transferControlToProxy() metodi.

In aggiunta a ciò, anche se un browser può supportare un certo tipo di contesto non v'è alcuna garanzia che l'oggetto può essere creato se le risorse di sistema come la memoria sono bassi nel qual caso sarebbe ritornato null.

Here is an overview di ciò che verrà restituito in diversi (comuni) scenari.

http://i.imgur.com/zqeZxv8.png

Quindi, a meno che non si sta utilizzando i trasferimenti proxy (che non è esattamente ampiamente supportati in questo momento) non c'è bisogno di utilizzare try-catch con getContext().

Suggerimento: in futuro la tela avrà una proprietà probablySupportsContext() che può essere utilizzata prima dello getContext(). Questo farà questi test e tornare false se le condizioni non sono soddisfatte (contesto supportato, già in uso con diversi tipi contesto, poche risorse, ecc):

var supported = canvas . probablySupportsContext(contextId [, ... ]) 

Restituisce false se chiamando getContext() gli stessi argomenti avrebbero restituisce definitivamente null e true altrimenti.

Aggiornamento Volevo solo approfondire un caso speciale - per fornitore specifico interni è in teoria possibile ottenere un'eccezione sollevata a seconda che molto specifica estensione e come si definisce il suo comportamento. Ma questi sono e non dovrebbero essere considerati parte dello standard e dal momento che sono sperimentali nella maggior parte dei casi, è implicito un comportamento a rischio e non standard.

+0

Questo è stato un post molto utile. Conferma la mia ipotesi, che un try/catch non è necessario qui (a condizione che non venga utilizzato alcun calcolo proxy). L'unico dubbio riguarda le "estensioni specifiche del fornitore", come "experimental-webgl". Ma probabilmente gli errori all'interno di questi sarebbero catturati dall'evento "webglcontextcreationerror". –

+0

Solo per completezza: nel repository ufficiale del gruppo Khronos, il wrapper per la creazione di un contesto webgl utilizza effettivamente un try/catch. Questo mi ha fatto riflettere. https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/common/webgl-utils.js –

Problemi correlati