Signatur
Beschreibung
GPUError ist die gemeinsame Basis aller WebGPU-Fehlerobjekte. Die meisten WebGPU-Aufrufe wie createBuffer(), createRenderPipeline() oder queue.submit() werfen bei Fehlern keine Ausnahme, denn die GPU arbeitet asynchron. Die Fehler werden stattdessen später gemeldet: entweder als Ergebnis von GPUDevice.popErrorScope() oder als error-Eigenschaft eines GPUUncapturedErrorEvent.
Man erzeugt GPUError nicht selbst. Die Fehler, die man tatsächlich erhält, sind Instanzen dieser Unterklassen:
GPUValidationError: ein Aufruf hat die Validierungsregeln verletzt, z. B. durch ungültige Deskriptoren, falsche Usage-Flags oder einen fehlerhaften Shader.GPUOutOfMemoryError: es war nicht genug Speicher für die angeforderte Ressource vorhanden.GPUInternalError: ein Fehler in der Implementierung, obwohl die Validierung bestanden wurde, z. B. weil Systemgrenzen überschritten wurden.
Das Interface hat nur eine Eigenschaft: message (string, schreibgeschützt). Sie enthält eine lesbare Beschreibung des Fehlers, die sich zum Debuggen eignet. Den Fehlertyp prüft man mit instanceof gegen die jeweilige Unterklasse.
Rückgabewert
GPUValidationError, GPUOutOfMemoryError oder GPUInternalError, jeweils mit der Eigenschaft message: string.Beispiele
Validierungsfehler mit einem Fehler-Scope abfangen
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
device.pushErrorScope('validation');
// Ungültig: MAP_READ darf nur zusammen mit COPY_DST verwendet werden
const buffer = device.createBuffer({
size: 256,
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.STORAGE,
});
const error = await device.popErrorScope();
if (error) {
console.log(error instanceof GPUError); // true
console.log(error instanceof GPUValidationError); // true
console.log(`Validierungsfehler: ${error.message}`);
}
Fehler zentral über das uncapturederror-Ereignis protokollieren
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const describe = (err) => {
if (err instanceof GPUValidationError) return 'Validierung';
if (err instanceof GPUOutOfMemoryError) return 'Kein Speicher';
if (err instanceof GPUInternalError) return 'Intern';
return 'Unbekannt';
};
device.addEventListener('uncapturederror', (event) => {
const { error } = event; // GPUError-Unterklasse
console.error(`[WebGPU/${describe(error)}] ${error.message}`);
});
// Alternativ über die on-Eigenschaft:
// device.onuncapturederror = (event) => console.error(event.error.message);
// Fehlerhafter Shader-Code löst das Ereignis aus
device.createShaderModule({ code: 'das ist kein WGSL' });
Speichermangel beim Anlegen großer Ressourcen behandeln
const createLargeTexture = async (device, size) => {
device.pushErrorScope('out-of-memory');
const texture = device.createTexture({
size: [size, size],
format: 'rgba8unorm',
usage: GPUTextureUsage.TEXTURE_BINDING,
});
const error = await device.popErrorScope();
if (error) {
console.warn(`Speichermangel bei ${size}px: ${error.message}`);
texture.destroy();
return size > 1024 ? createLargeTexture(device, size / 2) : null;
}
return texture;
};
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const tex = await createLargeTexture(device, 8192);
console.log(tex ? `Textur: ${tex.width}px` : 'Keine Textur möglich');
// Wichtig · Fallstricke
- Keine Ausnahmen: WebGPU-Aufrufe melden Fehler asynchron. Ein
try/catchumcreateBuffer()fängt keine Validierungsfehler ab. Dafür braucht manpushErrorScope()/popErrorScope()oder dasuncapturederror-Ereignis. - Filter der Scopes: Ein Scope fängt nur den Fehlertyp ab, mit dem er angelegt wurde (
'validation','out-of-memory'oder'internal'). Andere Fehler landen im nächsten äußeren Scope oder alsuncapturederror. Wenn mehrere Fehler auftreten, liefert ein Scope nur den ersten. - Kein stabiler Text: Der Inhalt von
messageist nicht standardisiert und unterscheidet sich je nach Browser. Er taugt zum Protokollieren, aber nicht für Programmlogik. Den Fehlertyp prüft man immer mitinstanceof. - Geräteverlust: Geht das Gerät verloren, wird kein
GPUErrorgemeldet. Das signalisiert stattdessen das PromiseGPUDevice.lost, das zu einemGPUDeviceLostInfoaufgelöst wird. - Kompatibilität: WebGPU steht nur in sicheren Kontexten (HTTPS) zur Verfügung und ist noch nicht in allen Browsern aktiviert. Vor der Nutzung sollte man
'gpu' in navigatorprüfen. In Workern ist die API ebenfalls verfügbar.