PAP für try catch

OP #6396570
Lesenswert?

also: mein Problem steht daraus, das der PAPDesigner vorgibt, dass es 
sowohl für einen Vorgang als auch für ein Unterprogramm nur einen 
logischen Ausgang gibt. Macht ja auch Sinn. Bis auf den Augenblick, wenn 
man mittels dieser Symbole neben dem try-Block(viel anderes kommt ja 
nicht in Frage) die catch-Klausel abdecken möchte
Gast #6396583
Lesenswert?

Antonow B. schrieb:

> also: mein Problem steht daraus, das der PAPDesigner vorgibt, dass es
> sowohl für einen Vorgang als auch für ein Unterprogramm nur einen
> logischen Ausgang gibt. Macht ja auch Sinn. Bis auf den Augenblick, wenn
> man mittels dieser Symbole neben dem try-Block(viel anderes kommt ja
> nicht in Frage) die catch-Klausel abdecken möchte

Wenn man logisch denken könnte, würde man daraus unweigerlich den Schluß 
ziehen, dass ein try-catch-Konstrukt wohl weder ein "Vorgang" noch ein 
Unterprogramm sein kann...

Wenn man logisch denken könnte, wie gesagt...
#6396664
Lesenswert?

Man muss sich nur den dämlichen Exception-Stack wegdenken und annehmen, 
dass jede Funktion neben dem eigentlichen Rückgabewert noch einen Fehler 
zurückgeben kann. Wer mit "multiple return values" gedanklich ein 
Problem hat, weil das die Sprache seiner Wahl nicht unterstützt, stelle 
sich einfach vor, dass der eigentliche Rückgabewert nicht direkt 
zurückgegeben wird, sondern in einem Struct (oder meinetwegen in einem 
Objekt) verpackt ist, welcher neben dem eigentlichen Rückgabewert noch 
eine Fehlervariable beinhaltet.

Dann prüft man mit einem simplen "if" die Fehlervariable (im 
Zweifelsfall innerhalb des zurückgegebenen structs) und führt entweder 
eine Fehlerbehandlung durch (z.B. durch weiterreichen des Fehlers an den 
Caller) oder macht eben einfach nichts, weil es keinen Fehler gab und 
verwendet das eigentliche Ergebnis im weiteren Programm.

Sowohl Go, als auch Rust machen das so (mit "multiple return values), 
also im Zweifel einfach mal nach "error handling in go" suchen, dann 
wird es klarer.
OP #6396747
Lesenswert?

Antonow B. schrieb:
> vielen Dank für deinen Beitrag. das mit der if-Anweisung hatte ich
> mir
> überlegt, aber aus verschiedenen Gründen verworfen. Hätte gerne eins zu
> eins die try-catch-Anweisung

vllt bin ich auch einfach nur ein stückweit dickköpfig. Könnte mir 
notfalls ein PAP in Word oder Powerpoint zeichnen. Nur: ich habe einige 
andere PAPs mit dem Designer erstellt, möchte kein inhomogenes 
Gesamtbild schaffen
#6396839
Lesenswert?

Antonow B. schrieb:
> vielen Dank für deinen Beitrag. das mit der if-Anweisung hatte ich mir
> überlegt, aber aus verschiedenen Gründen verworfen. Hätte gerne eins zu
> eins die try-catch-Anweisung

Naja, try-catch gibt es halt nicht "eins zu eins", weil try-catch eben 
einen Haufen Zeug hinter den Kulissen macht und PAP eben nur Zuweisung, 
Verzweigung und Wiederholung kennt, was eben grundsätzlich ausreichend 
ist. Das ein "richtiges" try-catch (wie z.B. in C++) so "weit entfernt 
von der eigentlichen Programmlogik" ist, ist unter anderem der Grund 
warum es das so in moderneren Sprachen gar nicht mehr gibt (siehe Go 
oder Rust).
Gast #6396890
Lesenswert?

> das so in moderneren Sprachen gar nicht mehr gibt

Das ist auch ausdruecklich zu begruessen.

Wer einmal das 50 GB grosse Logfile einer von Fickelbrogrammierern
geschriebene Applikation gesehen hat, wird wissen warum.
Die 50 GB kamen auch nicht im Betrieb zustande, sondern
waren nur das, was nach dem Start bis die Applikation
Online war, geloggt wurde.
Try und Catch hatten da einen wesentlichen Anteil...
Gast #6396924
Lesenswert?

Mit den Programmablaufplänen soll Einsteigern auf einer abstrakten Ebene 
die rudimentären Konzepte des Programmierens nahegebracht werden (so wie 
man Erstklässler mit Gummibären ans Rechnen führen kann).  Die Teile 
haben gar nicht den Anspruch, jedes Konstrukt einer konkreten Sprache 
abbilden zu können (mit Gummibären kommt man in der Mathematik auch 
nicht weit).

Falls die Einsteiger irgendwann mal zu Exceptions kommen, haben sie die 
Programmablaufpläne schon längst in die Tonne getreten.
Gast #6396948
Lesenswert?

foobar schrieb:

> Die Teile
> haben gar nicht den Anspruch, jedes Konstrukt einer konkreten Sprache
> abbilden zu können

Das ist zwar korrekt, aber irgendwie auch falsch. Im Prinzip brauchen 
sie nur zwei "Elemente" bereitstellen, am ALLES abbilden zu können, 
was sich als logisches Programm schreiben läßt.

Die zwei Elemente sind: Zuweisung und bedingte Verzweigung. Was darüber 
hinaus angeboten wird, sind schon Zusammenfassungen dieser beiden 
Grundelemente zwecks besserer Übersicht.

Im Prinzip genau wie der Syntaxbombast der Hochsprachen. Auch die fassen 
die Grundelemente zu (hoffentlich) besser lesbaren Strukturen zusammen. 
Nicht immer gelingt das...
#6397710
Lesenswert?

foobar schrieb:
> Mit den Programmablaufplänen soll Einsteigern auf einer abstrakten Ebene
> die rudimentären Konzepte des Programmierens nahegebracht werden

Wenn ich mir etwa Doku von integrierten Bootloadern anschaue bin ich 
immer froh, wenn es dazu einen Programmablaufplan gibt. Der ist 
"programmiersprachenneutral" und jeder kann den verstehen, nicht nur 
Anfänger.

foobar schrieb:
> Falls die Einsteiger irgendwann mal zu Exceptions kommen, haben sie die
> Programmablaufpläne schon längst in die Tonne getreten.

Hoffentlich nicht. Exceptions finde ich im Mikrocontroller-Bereich fast 
genauso unangebracht wie Java.
#6401266
Lesenswert?

Antonow B. schrieb:
> hat jemand noch einen Ansatz, z.B. ein anderes Tool, mit dem ich die
> try-catch Anweisung als PAP darstellen kann?

Nochmal im Klartext:
In einem Flowchart (PAP) gibt es wie von c-hater schon erwähnt nur zwei 
Dinge:
1. Zuweisung
2. Bedingte Verzweigung

Alles andere baut auf diesen beiden Blöcken auf, eben auch so etwas 
wie "try-catch" oder meinetwegen "try-catch-finally". Da kannst du noch 
so lange nach einem Tool suchen.

Da du scheinbar nicht kreativ genug bist um dir das selber auszumalen 
hier der erstbeste Suchtreffer für "try catch flowchart":
https://www.javascripttutorial.net/javascript-try-catch/
Moderator #6401311
Lesenswert?

Antonow B. schrieb:
> hat jemand noch einen Ansatz, z.B. ein anderes Tool, mit dem ich die
> try-catch Anweisung als PAP darstellen kann?

Try/Catch/Finally-Konstrukte lassen sich in einem PAP nicht vernünftig
darstellen, weil es dafür keine passenden Symbole gibt. Eine Darstellung
mit den gegebenen Symbolen (Terminator, Operation, Unterprogramm,
Verzweigung, Pfeil, usw.) ist zwar prinzipiell möglich, führt aber
schnell zu einem unübersichtlichen Gewirr, insbesondere dann, wenn

- der Try-Block mehr als eine Operation enthält,

- es mehr als einen Catch-Block gibt,

- es einen Finally-Block gibt und/oder

- nur ein Teil der Exceptions gecatcht werden.

Ich wüsste auch nicht, welche zusätzlichen Symbole eingeführt werden
müssten, um dieses Manko zu beheben. Hast du vielleicht eine Idee dazu?
Wenn ja, kannst du ja ein bestehendes Tool wie Dia oder Visio um diese
neuen Symbole erweitern.

PAPs sind eben sehr viel älter als imperative Programmiersprachen, die
die Ausnahmebehandlung mittels Try und Catch erlauben.

Ein adäquateres Mittel zur Beschreibung solcher Konstrukte ist
Pseudocode. Da Pseudocode als halbformale Beschreibungsform sehr
flexibel ist, hat er PAPs, Struktogramme und dergleichen weitgehend
verdrängt. Zudem ist eine Beschreibung in Pseudocode viel kompakter, so
dass damit auch komplexere Algorithmen noch halbwegs übersichtlich
dargestellt werden können.
OP #6401377
Lesenswert?

Christopher J. schrieb:
> lles andere baut auf diesen beiden Blöcken auf, eben auch so etwas
> wie "try-catch" oder meinetwegen "try-catch-finally". Da kannst du noch
> so lange nach einem Tool suchen.
>
> Da du scheinbar nicht kreativ genug bist um dir das selber auszumalen
> hier der erstbeste Suchtreffer für "try catch flowchart":
> https://www.javascripttutorial.net/javascript-try-catch/

nur das dass nicht ein PAP mit dem tr ycatch oist, sondern über. Der 
Unterschied: wie kann ich try, was da als ein Block dargestellt ist, 
detaillierte darstellen.

Zumal das der Lösung mit der if-Abfrage entspricht
#6401378
Lesenswert?

Christopher J. schrieb:
> Da du scheinbar nicht kreativ genug bist um dir das selber auszumalen
> hier der erstbeste Suchtreffer für "try catch flowchart":
> https://www.javascripttutorial.net/javascript-try-catch/

Das Problem ist, dass es sich dabei um ein Diagramm handelt, das nur 
dazu dient, das Exception-Handling selbst zu erklären. Aber ein Programm 
damit darzustellen, das einfach Exceptions benutzt, dürfte damit in den 
meisten Fällen nicht sinnvoll möglicht sein. Die Aktion "Execute try 
block" wird z.B. ggf. nur teilweise ausgeführt, eben bis zu dem Punkt, 
wo eine Exception auftritt. Das wird in diesem Diagramm durch den 
nachfolgenden Teil "Ignore the rest of try block" dargestellt. Abgesehen 
davon, dass das teilweise nicht-Ausführen einer vorangegangenen Aktion 
selbst gar keine richtige Aktion ist, kann "the rest" variieren, je 
nachdem, wo genau die Exception auftritt.
Beitrag #6402152 wurde von einem Moderator gelöscht.
OP #6402314
Lesenswert?

1
OpenPort()
2
{
3
try 
4
{
5
Falls Port offen
6
    viClose() //Port schließen
7
viOpenDefaultRM ()
8
viOpen ()
9

10
falls Globls.errorStatus < visa32.VI_SUCCESS // Fehler liegt for
11
  MessageBox (Fehlermeldung "Unable to Open port; check address")
12

13
SendCmd(*IDN?) 
14
Variable = GetData()
15
Modellnummer aus Variable extrahieren
16
Falls ModellnummerVariable != ModellnummerGerät
17
   Messagebox (Fehlermeldung falsches Gerät adressiert)
18
}
19
Catch (Exception e)
20
{
21
   Messagebox (e.Message) // Ruft Medlung auf, die dien aktuelle Ausnahme beschreibt
22
}
23
}

ich habe mich mal versucht. Würdet ihr das als Pseudocode bezeichnen?
Die Funktionen wie viOpen() usw habe ich separat erklärt.
Gast #6402949
Lesenswert?

In meinen PAP findet man mit Absicht nicht jedes einzelne if Statement 
und jede Loop wieder - schon gar nicht alle Variablen. Sie

Da gibt es eher Symbole mit Labels wie "Send notification with async 
repeat", oder: "Try to store the image until success or timeout".

Solche Diagramme sind nett, um Geschäftslogik in ihren einfachen 
geradeaus-Fällen darzustellen. Also eher für den groben Überblick. Wer 
aber alle Details sehen will, soll sich den Quelltext anschauen oder die 
Anforderungen lesen. Der Quelltext weicht in der Praxis sowieso oft 
genug von den zuvor gezeichneten Diagrammen ab, nachdem man alle 
Nachforderungen, Sonderlocken und Designlücken (die erst beim 
Entwickeln/Testen auffallen) implementiert hat.

Komplette Programme detailliert als Diagramm zu beschreiben, ist meiner 
Meinung nach eine Schnapsidee. Was ich von UML-zu-Code-Generatoren 
halte, kann man daraus ableiten.
Gast #6402984
Lesenswert?

Antonow B. schrieb:
> was ist mit Pseudocode?
> ich meinte meine konkrete Umsetzung

Sie setzt voraus, dass man sich mit Exceptions in der jeweiligen 
Variante auskennt. Ich kenne keinen Anwender, keinen Betriebler und 
keinen Projektmanager, der damit etwas anfangen könnte.

Das ist auch unklar:
> Variable = GetData()

Da würde ich schrieben:
> set variable = getData

Da wo ich derzeit arbeite, dokumentiert man den Code nach dem 
Programmieren (also zusätzlich zu den Anforderungsdokumenten) etwa so:
1
* Load the current active contract of the requested subscription from DB
2
* if the contract has property useMaxiFoo=true, then
3
  * call sub-function processMaxiFoo()   <---- Mit Link
4
  * If the result is >10, then
5
    * abort with error 2030, "MaxiFoo of subscription...cannot exceed 10"
6
  * else (maxiFoo is not to large)
7
    * update bucket of customer of subscription by adding the maxiFoo value
8
* else (useMaxiFoo=false)
9
  * call sub-function processWithoutMaxiFoo()   <---- Mit Link
10
* Return the current contract details as specified in the JSON schema
11

12
If any unexpected error occured in the block above, then roll-back all changes to the DB and return the related error code and text to the caller
13
in ErrorResponseType format.
14
          ^
15
          |
16
        Mit Link
Das ist für Techniker OK, kann man aber so nicht außer Haus geben.
Gast #6402995
Lesenswert?

Antonow B. schrieb:
> Stefan ⛄ F. schrieb:
>> Da würde ich schrieben:
>>> set variable = getData
>
> woran kann man dann erkennen, dass es sich bei getData um einen
> Funktionsaufruf handelt?

Weil es ein Link zum entsprechenden Dokument ist. Außerdem ergibt sich 
das aus dem Namen. Da hat natürlich jede Firma ihre eigenen Vorgaben. 
Aber es sollte schon klar erkennbar sein. Die Variable würde man ja auch 
nicth "variable" nennen. Ein relaes Beispiel:

* set totalAmount = computTotalAmount of the current order

Wobei computTotalAmount halt ein Link auf die Beschreibung der Funktion 
wäre.

Ich schlage vor, diesen Gedanken hier abzuschließen, um zurück zur Frage 
des TO (PAP) zu kommen.
#6403072
Lesenswert?

Antonow B. schrieb:
> was sagst du denn zur Umsetzung meines Pseudocodes?

Ich finde, er ist zu wenig abstrahiert. Wenn du den echten Quellcode 
hinschreiben würdest, wäre der nicht so viel anders. Was gewinnst du da 
durch den Pseudocode?
Zum Beispiel bei
1
falls Globls.errorStatus < visa32.VI_SUCCESS
vermute ich mal, dass der einzige Unterschied ist, dass im Quellcode 
halt "if" statt "falls" und ein zusätzliches Klammernpaar steht.
OP #6403089
Lesenswert?

1
CheckError()
2
{
3
SendCmd(zu prüfende Funktion)
4
VariableAbfrage = GetData()
5
VariableNummer = Fehlernummer aus VariableNachricht extrahieren
6
VariableNachricht = Dazugehörige Fehlermeldung ermitteln
7

8
Wiederhole (Fehleranzahl != 0)
9
{
10
VariableShow = VariableNummer + Variablenachricht
11
 MessageBox (variableShow)
12
SendCmd(zu prüfende Funktion)
13
VariableAbfrage = GetData()
14
VariableNummer = Fehlernummer aus VariableNachricht extrahieren
15
VariableNachricht = Dazugehörige Fehlermeldung ermitteln
16
GlobaleVariablen.Fehler = true
17
}
18
SendCmd (CLS)
19
}
was ist damit? ist eine andere methode
#6403269
Lesenswert?

Stefan ⛄ F. schrieb:
> Komplette Programme detailliert als Diagramm zu beschreiben, ist meiner
> Meinung nach eine Schnapsidee.

So ist es. Man zerlegt ein Projekt in mehrere sinnvolle Teilaufgaben und 
legt dafür je einen PAP an.
Z.B. gibt es haufenweise Ursachen, warum das Öffnen einer Datei 
fehlschlagen kann (keine Zugriffsrechte, keine Schreibrechte, ungültige 
Zeichen im Namen, ungültiges Verzeichnis, Datei existiert bereits usw.).
Dann mancht man einen PAP nur für das Öffnen, die Fehlererkennung und 
Behandlung. Und diesen PAP ruft man dann im übergeordneten PAP auf, mit 
nur 2 Ergebnissen, pass oder fail.
Gast #6403855
Lesenswert?

Antonow B. schrieb:
> das mit Link halte ich aber nicht für intuitiv

Wie gesagt, jede Firma findet ihren eigenen optimalen Weg. Ich habe mir 
das nicht ausgedacht, sondern alle Mitarbeiter der Firma gemeinsam. 
Jeder findet irgend etwa gut und schlecht, so dass man am Ende einen 
Kompromiss wählt, mit dem alle klar kommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren