Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

catch_all: try_table-Klausel

Die catch_all-Klausel fängt jede Ausnahme ab und schiebt nichts auf den Stapel.

Probieren Sie es aus

(module
  ;; Import the error tag and the log function
  (tag $my_error (import "env" "my_error") (param i32))
  (import "env" "log" (func $log))

  (func $try_and_catch (param $value i32)
    ;; catch_all catches any exception thrown
    (block $handler
      (try_table (catch_all $handler)
        (call $might_throw (local.get $value))
      )
      (return)
    )
    ;; Call log to notify user that exception has been thrown
    call $log
  )

  ;; Function that throws an error of type $my_error
  ;; when its parameter is less than 0
  (func $might_throw (param $value i32)
    (local.get $value)
    (i32.const 0)
    (i32.lt_s)
    (if
      (then
        (i32.const 42)
        (throw $my_error)
      )
    )
  )

  (export "try_and_catch" (func $try_and_catch))
)
// Define error tag in JS
const myErrorTag = new WebAssembly.Tag({ parameters: ["i32"] });

// Import the tag and the log function into the module
const env = {
  my_error: myErrorTag,
  log() {
    console.log("An error was caught!");
  },
};

WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), { env }).then(
  // Negative value causes function to throw
  (result) => result.instance.exports.try_and_catch(-1),
);

Syntax

catch_all block_identifier
catch_all

Die catch_all-Klausel.

block_identifier

Der Bezeichner für den block, zu dem verzweigt wird, wenn die Ausnahme abgefangen wird. Dies kann sein:

  • Ein identifizierender Name, wie durch den Bezeichner des entsprechenden Blocks definiert.
  • Eine Block-Indexnummer — 0, um den innersten Block zu identifizieren, 1 für den nächst inneren usw.

Typ

[] -> []

Binäre Kodierung

Klausel catch_all Typ-Byte
catch_all 0x02

catch_all ist keine eigenständige Klausel – stattdessen wird sie als Klausel innerhalb einer try_table-Anweisung mit einem Byte von 0x02 kodiert. Eine try_table mit einer einzelnen catch_all-Klausel:

wat
(try_table (catch_all $handler) ... )

würde so kodiert werden:

... 0x01 0x02 0x00 ...

Beschreibung

Die catch_all-Klausel kann innerhalb eines try_table-Blocks enthalten sein, um jede geworfene Ausnahme abzufangen. Wenn eine Ausnahme ausgelöst wird, verzweigt der Code zu dem angegebenen block.

catch_all ist nützlich, wenn Sie eine Ausnahme nicht erneut werfen müssen und Sie keine spezifische Ausnahme abfangen möchten, aber dennoch berichten möchten, dass eine Ausnahme irgendeiner Art aufgetreten ist.

Im Falle von catch_all muss der referenzierte Block keinen Ergebnistyp deklarieren, der zur Nutzlast der Ausnahme passt, da kein Ergebnis auf den Stapel geschoben wird. Im vorher gezeigten Beispiel hat der block keinen deklarierten Ergebnistyp:

wat
(block $handler
  ...
)

Siehe auch