2016-04-18 61 views
5

以下代碼是否會拋出錯誤?嘗試創建渲染上下文時,瀏覽器會拋出錯誤嗎?

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

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

在鉻中,它只返回null。

如果所請求的渲染上下文對瀏覽器是已知的,情況如何? (如「webgl」或「experimental-webgl」)是否有可能發生錯誤異常?在鉻中,我無法激起這種行爲。

換句話說:我是否需要將這段代碼封裝在一個try/catch中,以清楚地檢查渲染上下文嗎?

有沒有可能將物品化的方法?例如。通過嘗試在不同瀏覽器中剪切代碼的Web服務並列出其可能不同的結果。

+0

是的,對我來說它看起來也是這樣。但可能有一個瀏覽器支持「2D」上下文,而沒有其他的。但即使禁用webgl,我也會返回null作爲返回值。創建時,我不確定是否可能有異常,因爲document.createElement(「something」)對我來說沒有異常返回undefined。 –

+0

不是一個笨蛋,但相關,http://stackoverflow.com/questions/36565598/webglcontextcreationerror-event-is-it-triggered-synchronously/36566263#36566263此外,這個事件確實存在的事實意味着是的,瀏覽器**可以**拋出一個錯誤。 – Kaiido

+1

感謝您的鏈接。我知道「webglcontextcreationerror」事件。我不是百分之百確定這裏的術語,但我認爲這並不是拋出一個錯誤,因爲我無法在另一個地方看到它(用try/catch)。我會說,這是一個常規事件,這被定義爲「......錯誤」。但請,有人糾正我,如果我在這裏錯了, –

回答

2

返回nullexpected behavior如果請求的情況下不可用,還是在畫布已經被分配到不同類型的上下文:如果給定上下文ID不支持

返回null,如果畫布 已經用其他上下文類型初始化(例如,在獲得「webgl」上下文後嘗試 以獲取「2d」上下文)。

有特殊情況下的異常可能拋出相關的代理方案(同上):

拋出一個InvalidStateError異常,如果已經使用了setContext()transferControlToProxy()方法。

除此之外,即使瀏覽器可以支持特定類型的上下文沒有保證的是,如果系統資源,例如存儲器是低在這種情況下null將被返回的對象可以被創建。

Here is an overview將在不同(常見)情況下返回的內容。

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

所以,除非你正在使用代理轉移(這不正是廣泛支持在這個時候),你不需要使用try-catchgetContext()

提示:未來畫布將獲得一個屬性probablySupportsContext(),它可以在getContext()之前使用。這將做這些測試並返回false如果條件不滿足(支持的背景下,已經在不同的上下文類型,低資源等使用):

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

返回FALSE如果調用getContext()具有相同的參數會 肯定返回null,否則返回true。

更新只是想闡述一個特例 - 特定擴展它在理論上可能獲得取決於非常特定的擴展,以及它如何定義自己的行爲引發的異常供應商。但是這些不應該被視爲標準的一部分,並且由於它們在大多數情況下都是實驗性的,所以隱含了風險和非標準行爲。

+0

這是一個非常有用的職位。它證實了我的猜測,即try/catch在這裏是不必要的(假設沒有使用代理計算)。唯一的疑問仍然是「特定於供應商的擴展」,比如「experimental-webgl」。但這些內部的錯誤可能會被「webglcontextcreationerror」事件捕獲。 –

+0

只是爲了完整:在Khronos組的官方回購中,用於創建webgl上下文的包裝確實使用try/catch。這讓我想知道。 https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/common/webgl-utils.js –

相關問題