Signatur
Beschreibung
Der Konstruktor GPUInternalError() erzeugt ein Objekt vom Typ GPUInternalError. Dieses Interface erbt von GPUError. Normalerweise erzeugt der Browser solche Objekte selbst, zum Beispiel wenn eine Operation trotz korrekter Nutzung der API scheitert, weil ein Limit des Systems überschritten wird, das sich über GPUSupportedLimits nicht ausdrücken lässt. Ein typischer Fall ist ein zu komplexer Shader, den der Treiber nicht kompilieren kann.
Als Entwickler bekommst du einen GPUInternalError meist nicht über den Konstruktor, sondern auf einem von zwei Wegen:
- über
device.pushErrorScope("internal")und das Promise vondevice.popErrorScope(), - über das Ereignis
uncapturederroramGPUDevice, und zwar alsevent.error.
Den Konstruktor selbst von Hand aufzurufen, lohnt sich vor allem in Tests und bei Mocks. Damit kannst du Fehlerbehandlung, Protokollierung oder die Anzeige für Nutzer prüfen, ohne dass tatsächlich ein interner GPU-Fehler auftritt. Die übergebene Nachricht steht anschließend in der schreibgeschützten Eigenschaft message.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message Pflicht | string | Beschreibt, warum der Fehler aufgetreten ist. Der Text steht später in error.message. |
Rückgabewert
GPUInternalError-Objekt, dessen message die übergebene Nachricht enthält.Beispiele
Instanz erzeugen und prüfen
if ('GPUInternalError' in globalThis) {
const err = new GPUInternalError('Shader zu komplex für den Treiber');
console.log(err.message);
console.log(err instanceof GPUError);
} else {
console.log('WebGPU wird nicht unterstützt');
}
Interne Fehler über Error-Scopes abfangen
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('Kein GPU-Adapter verfügbar');
const device = await adapter.requestDevice();
device.pushErrorScope('internal');
const module = device.createShaderModule({
code: `@compute @workgroup_size(64) fn main() {}`
});
const error = await device.popErrorScope();
if (error instanceof GPUInternalError) {
console.warn('Interner GPU-Fehler:', error.message);
// z. B. auf einfacheren Shader zurückfallen
} else {
console.log('Shader erfolgreich erstellt');
}
Fehlerbehandlung mit selbst erzeugtem Fehler testen
const handleGpuError = (error) => {
if (error instanceof GPUInternalError) return 'intern';
if (error instanceof GPUValidationError) return 'validierung';
if (error instanceof GPUOutOfMemoryError) return 'speicher';
return 'unbekannt';
};
// Test ohne echte GPU-Operation
const fake = new GPUInternalError('Simulierter Treiberfehler');
console.log(handleGpuError(fake));
Nicht abgefangene Fehler global protokollieren
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
device.addEventListener('uncapturederror', (event) => {
if (event.error instanceof GPUInternalError) {
console.error('Interner WebGPU-Fehler:', event.error.message);
}
});
// Wichtig · Fallstricke
- Kompatibilität: WebGPU ist noch nicht in allen Browsern und auf allen Plattformen verfügbar. Es funktioniert nur in sicheren Kontexten (HTTPS oder localhost). Prüfe die Unterstützung vorher mit
'gpu' in navigatoroder'GPUInternalError' in globalThis. - Ein selbst erzeugter
GPUInternalErrorist nur ein Datenobjekt. Er wird weder an das Gerät gemeldet noch löst eruncapturederroraus. GPUErrorund damit auchGPUInternalErrorerben nicht vonError. Deshalb gibt es keinenstack, underr instanceof Errorergibtfalse. Wenn du einen solchen Fehler mitthrowauslöst, verpacke ihn besser, zum Beispiel mitnew Error(err.message, { cause: err }).- Interne Fehler können auch bei gültigem Code auftreten und hängen vom Gerät oder Treiber ab. Plane also Ausweichlösungen ein, etwa einfachere Shader oder kleinere Ressourcen.
- Der Inhalt von
messageist nicht standardisiert und unterscheidet sich je nach Browser. Verwende ihn nur zur Protokollierung und nicht für Programmlogik.