Ausnahmen sind schwer richtig zu machen. Ein besonders kniffliges und leicht zu übersehendes Problem ist die Möglichkeit der Teilauswertung innerhalb von tryBlöcken.
Betrachten Sie das folgende JavaScript-Programm:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: [],
b: ["item2", "item3", "item4", "item1"],
}
{
a: [],
b: ["item2", "item3", "item4"],
}
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
if (b.isFull()) {
throw new Error("b is full");
}
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
Eine andere Möglichkeit besteht darin, eine Kopie der Variablen zu speichern, die sich möglicherweise ändern, und sie wiederherzustellen unter catch:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
const aCopy = a.copy();
const bCopy = b.copy();
try {
const item = a.pop();
b.push(item);
} catch (e) {
a = aCopy;
b = bCopy;
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
copyOperation definiert werdencopyOperation vorhanden ist, ist sie möglicherweise nicht effizienta.popNebenwirkungen auftreten, werden diese Nebenwirkungen nicht rückgängig gemachtlet a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
let item;
try {
item = a.pop();
} catch (e) {
console.error("Failed to move item from a to b", e);
console.log({ a, b });
return;
}
try {
b.push(item);
} catch (e) {
a.unPop(item);
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
a.unPop(item)erfordert, dass wir verstehen, dass diese Operation erforderlich ist, wenn b.push(item)sie fehlschlägt, was immer noch leicht zu übersehen istIn ValueScript trysind Blöcke transaktional – sie werden entweder bis zum Ende ausgeführt oder zurückgesetzt.
Unser ursprüngliches Programm macht das, was wir wollten, ohne Änderungen:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: ["item1"],
b: ["item2", "item3", "item4"],
}
copyVorgang erforderlich“ aCopy = a, und dies entspricht dem KopierencopyMöglicherweise nicht effizient“ a.popwerden nicht rückgängig gemacht“ * Einige großartige Fremdfunktionen könnten Wiederherstellungsoperationen enthalten, und diese würden automatisch aufgerufen
ValueScript ist ein Dialekt von TypeScript mit Wertsemantik. Es hat einen Online-Spielplatz, der eine Demonstration des Programms dieses Artikels enthält , und es ist Open Source .
Diese Woche erhielt ich eine E-Mail von einem Mitglied der täglichen E-Mail-Liste. Sie wollten wissen: Welche Ressourcen besuchen Sie täglich, wöchentlich und monatlich? Tolle Frage! Ich versuche gerne, einige Einblicke in meinen Arbeitsablauf und die wichtigsten Ressourcen, die ich verwende, mit Ihnen zu teilen.
Der Zweck dieser Blogreihe besteht darin, tief in die Lit-Bibliothek einzutauchen und ein umfassendes Verständnis ihrer einzigartigen Funktionen zu erlangen und zu erfahren, wie sie sich von anderen Bibliotheken und Frameworks auf dem Markt unterscheidet. Die Reihe ist in drei Teile gegliedert und behandelt Themen wie 1.
In der sich schnell entwickelnden Geschäftslandschaft von heute hat das Konzept der Hybrid- und Remote-Arbeit eine beispiellose Dynamik erlangt. Während sich Unternehmen weiterhin an die sich verändernden Bedürfnisse und Erwartungen ihrer Mitarbeiter anpassen, sind Experten aus verschiedenen Bereichen zusammengekommen, um die Vorteile, Herausforderungen und die Zukunft dieser transformativen Arbeitsweise zu diskutieren.
„Er wird mich beschützen, wenn ich in Gefahr bin. Er wird mich in seinem Zelt verstecken.
Offenes Tagebuch: Ein Bild pro Tag. Geschichten haben mich schon immer fasziniert.
Wenn wir auf diesem Planeten weiterhin erfolgreich sein wollen, müssen wir gefährliche Gespräche führen. Diejenigen, die das in Frage stellen, was wir getan haben, was wir tun und was wir derzeit weiterhin tun werden (oder planen).