Tracks
/
Factor
Factor
/
Übungen
/
Fabrik-Ausfallsicherheit
Fabrik-Ausfallsicherheit

Fabrik-Ausfallsicherheit

Lernübung

Einführung

Das Fehlersystem von Factor besteht aus drei Teilen: throw, um einen Fehler zu melden, recover, um einen zu behandeln, und ERROR:, um deine eigene Fehlerart zu definieren.

throw

throw (in kernel) löst einen Fehler aus. Das Argument kann jeder beliebige Wert sein, egal ob String, Zahl oder Tupel, und es wird zu dem Fehler, den du später untersuchen kannst:

! DOCTEST: SKIP
"file not found" throw

throw kehrt nicht zurück; der Rest des aktuellen Words wird übersprungen.

recover

recover (in continuations) ist das try/catch von Factor. Es nimmt eine try-Quotation und eine recovery-Quotation:

recover ( try recovery -- )

Wenn try ohne Fehler durchläuft, wird recovery ignoriert. Wenn try einen Fehler auslöst, wird der Fehler auf den Stack gelegt und recovery ausgeführt:

[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"

[ "ok" ] [ drop "never runs" ] recover .
! => "ok"

when aus kernel ist der natürliche Begleiter: Es führt eine Quotation nur dann aus, wenn der oberste Wert auf dem Stack wahr ist:

: check-positive ( n -- )
    0 < [ "negative!" throw ] when ;

ERROR:

ERROR: definiert eine Tupelklasse und ein Word, das eine neue Instanz erzeugt und sie auslöst:

! DOCTEST: SKIP
ERROR: not-found path ;

"/missing" not-found
! throws T{ not-found { path "/missing" } }

Ein Fehler ohne Slots ist einfach ERROR: name ;. Der Aufruf von name löst eine leere Instanz aus. Tupel, die mit ERROR: definiert werden, bringen ein Klassenprädikat name? mit, mit dem du prüfen kannst, ob ein gefangener Fehler von diesem Typ war.

Slots wieder auslesen

Ein gefangener Fehler ist einfach ein Tupel, deshalb bringt jeder Slot von ERROR: denselben automatisch generierten slot>>-Reader mit wie jedes andere Tupel.

! DOCTEST: SKIP
{
    T{ not-found { path "/a" } }
    T{ not-found { path "/b" } }
}
[ path>> ] map .   ! => { "/a" "/b" }

Anleitung

Elena, die neue Qualitätsmanagerin in einer Zeitungsfabrik, bittet dich, ein kleines Programm zu schreiben, das den Produktionsraum überwacht.

1. Definiere einen eigenen Fehler

Definiere mit dem Parsing-Wort ERROR: eine Fehler-Tupelklasse machine-error. Sie braucht keine Slots.

machine-error   ! throws a fresh machine-error

2. Prüfe die Luftfeuchtigkeit

Definiere check-humidity. Die Funktion nimmt einen Luftfeuchtigkeitswert vom Stack und throwt den String "humidity too high", wenn der Wert echt größer als 70 ist. Andernfalls gibt sie nichts zurück.

50 check-humidity   ! returns nothing
80 check-humidity   ! throws "humidity too high"

3. Prüfe die Temperatur

Definiere check-temperature. Die Funktion nimmt einen Temperaturwert und throwt den String "temperature too high", wenn der Wert echt größer als 500 ist. Andernfalls gibt sie nichts zurück.

400 check-temperature   ! returns nothing
600 check-temperature   ! throws "temperature too high"

4. Überwache die Maschine

Definiere monitor so, dass die Funktion eine Luftfeuchtigkeit und eine Temperatur vom Stack nimmt und beide Prüfungen ausführt. Wenn eine der Prüfungen einen Fehler wirft, soll monitor stattdessen einen frischen machine-error werfen. Wenn beide bestehen, gibt monitor nichts zurück.

50 400 monitor   ! returns nothing
80 400 monitor   ! throws a machine-error
50 600 monitor   ! throws a machine-error

5. Überwache eine Reihe von Messwerten

Definiere monitor-batch so, dass die Funktion ein Array von { humidity temperature }-Messwerten nimmt und zurückgibt, wie viele davon fehlschlagen würden (d. h., wie viele monitor zum Werfen bringen würden).

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Factor Exercism

Bereit, mit Fabrik-Ausfallsicherheit zu starten?

Melde dich bei Exercism an, um Factor mit 47 Konzepte163 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.