Start · Sprachen · JavaScript · Referenz · Sensor: error

Sensor: error

Ereignis

Wird an einem <code>Sensor</code>-Objekt ausgelöst, wenn der Sensor nicht gestartet werden kann oder während des Betriebs ein Fehler auftritt.

seit JavaScript Generic Sensor API – Chromium-Browser (Chrome/Edge Kategorie: webapi

Signatur

sensor.addEventListener("error", (event) => { … })

Beschreibung

Das error-Ereignis gehört zur Generic Sensor API. Es wird an allen abgeleiteten Sensor-Klassen ausgelöst, etwa Accelerometer, Gyroscope, Magnetometer, AbsoluteOrientationSensor, RelativeOrientationSensor, AmbientLightSensor oder GravitySensor. Das passiert in zwei Fällen: wenn nach sensor.start() keine Messwerte geliefert werden können oder wenn ein laufender Sensor ausfällt.

Der Handler bekommt ein SensorErrorEvent. Dessen Eigenschaft error enthält eine DOMException, und über error.name lässt sich die Ursache unterscheiden:

  • NotAllowedError – der Nutzer oder der Browser hat die nötige Berechtigung verweigert (Permissions API, z. B. "accelerometer").
  • NotReadableError – der Sensor ist nicht erreichbar, zum Beispiel weil das Gerät keine passende Hardware hat oder sie gerade anderweitig belegt ist.
  • NotSupportedError – der Sensortyp oder die gewünschten Optionen werden vom Gerät nicht unterstützt.

Sie können den Handler mit addEventListener("error", handler) registrieren oder über die Eigenschaft sensor.onerror = handler. Nach einem Fehler geht der Sensor in den Zustand „idle“ über: sensor.activated ist dann false, und reading-Ereignisse kommen nicht mehr an. Behandeln Sie das Ereignis deshalb immer. Nur so kann Ihre Anwendung sauber auf eine Alternative umschalten, etwa auf DeviceMotionEvent, oder dem Nutzer einen Hinweis zeigen.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Der Ereignisname, hier immer "error".
$listener Pflicht (event: SensorErrorEvent) => void Callback-Funktion, die ein SensorErrorEvent bekommt. Die Ursache steht in event.error (eine DOMException).
$options boolean | AddEventListenerOptions false Optionale Einstellungen wie once, signal oder capture.

Rückgabewert

Typ
void
Beschreibung
addEventListener gibt nichts zurück. Der Handler bekommt ein SensorErrorEvent mit der Eigenschaft error: DOMException.

Beispiele

Fehler beim Beschleunigungssensor mit addEventListener auswerten

if ('Accelerometer' in window) {
  const sensor = new Accelerometer({ frequency: 30 });

  sensor.addEventListener('reading', () => {
    console.log(`x=${sensor.x?.toFixed(2)} y=${sensor.y?.toFixed(2)} z=${sensor.z?.toFixed(2)}`);
  });

  sensor.addEventListener('error', (event) => {
    const { name, message } = event.error;
    if (name === 'NotAllowedError') {
      console.warn('Zugriff auf den Sensor wurde verweigert.');
    } else if (name === 'NotReadableError') {
      console.warn('Sensor ist nicht verfügbar.');
    } else {
      console.error(`Sensorfehler (${name}): ${message}`);
    }
  });

  sensor.start();
} else {
  console.log('Accelerometer wird nicht unterstützt.');
}
Sensor ist nicht verfügbar. // z. B. auf einem Desktop-PC ohne Beschleunigungssensor

Handler über die onerror-Eigenschaft setzen

const light = new AmbientLightSensor();

light.onreading = () => {
  document.body.classList.toggle('dark', light.illuminance < 50);
};

light.onerror = (event) => {
  console.log('Lichtsensor-Fehler:', event.error.name);
  // Handler wieder entfernen
  light.onerror = null;
};

light.start();
Lichtsensor-Fehler: NotAllowedError

Robuster Start mit Berechtigungsprüfung, Ausweichlösung und removeEventListener

const startGyroscope = async () => {
  let sensor;
  try {
    const { state } = await navigator.permissions.query({ name: 'gyroscope' });
    if (state === 'denied') throw new Error('Berechtigung verweigert');

    // Kann synchron einen SecurityError werfen (Permissions-Policy)
    sensor = new Gyroscope({ frequency: 60 });
  } catch (err) {
    console.warn('Gyroscope nicht nutzbar, nutze devicemotion:', err.message);
    window.addEventListener('devicemotion', (e) => console.log(e.rotationRate));
    return;
  }

  const onError = (event) => {
    console.error('Gyroscope-Fehler:', event.error.name);
    sensor.stop();
    sensor.removeEventListener('error', onError);
  };

  sensor.addEventListener('error', onError);
  sensor.addEventListener('reading', () => console.log(sensor.x, sensor.y, sensor.z));
  sensor.start();
};

startGyroscope();
Gyroscope-Fehler: NotReadableError

// Wichtig · Fallstricke

  • Nicht alle Fehler kommen als Ereignis an: Blockiert eine Permissions-Policy (allow="accelerometer" usw.) den Zugriff, wirft schon der Konstruktor synchron einen SecurityError. Ist die Klasse gar nicht vorhanden, gibt es einen ReferenceError. Umschließen Sie new XyzSensor() deshalb mit try…catch.
  • Sicherer Kontext nötig: Die Generic Sensor API steht nur über HTTPS (oder localhost) zur Verfügung. In Cross-Origin-iframes muss die passende Permissions-Policy gesetzt sein.
  • Browser-Unterstützung: Nur Chromium-basierte Browser unterstützen die API, also Chrome, Edge und Opera, vor allem auf Mobilgeräten. Firefox und Safari unterstützen sie nicht. AmbientLightSensor ist außerdem nur hinter einem Flag verfügbar. Prüfen Sie immer vorher per Feature-Erkennung ('Accelerometer' in window) und sehen Sie eine Ausweichlösung vor, etwa DeviceMotionEvent oder DeviceOrientationEvent.
  • Nach einem Fehler ist der Sensor inaktiv (activated === false). Einen erneuten Versuch starten Sie mit sensor.start(), zum Beispiel nachdem der Nutzer die Berechtigung erteilt hat.
  • Das Ereignis steigt nicht im DOM auf (kein Bubbling), weil Sensor kein DOM-Knoten ist. Registrieren Sie den Handler deshalb direkt an der Sensor-Instanz.