Domino 9 und frühere Versionen > ND6: Entwicklung

.CreateFromTemplate

<< < (2/2)

koehlerbv:
Um jetzt dahinter zu kommen, wo jetzt der Fehlr in Deinem Code liegt, braucht es sicher nicht nur den kompletten Code, sondern auch noch eine Beschreibung des gesamten Kontextes.

Das ist aber nicht der Kern: Du verwendest "On Error Resume Next". Gleichzeitig schreibst Du:

--- Zitat ---Warum es überhaupt aufgetreten ist, hab' ich zwar nicht verstanden, aber ich muss ja auch nicht alles wissen...
--- Ende Zitat ---
Diese Verbindung ist ein absolutes "no-no". "On Error Resume Next" sollte darf man niemals verwenden, es sei denn, man weiss sicher, was passiert und wie darauf zu reagieren ist. Alles andere ist programmiertechnisch "Russisches Roulette", wie Du ja selbst erlebt hast: Du verlierst komplett die Kontrolle.

Denkbar wäre beispielsweise folgendes Konstrukt:

On Error Goto NormalErrorHandler
... Code ...
'Jetzt wird es speziell:
On Error Goto IchBefuerchteFehler1024
... Code ...
'Schweiss abwisch' - es ist gut gegangen:
On Error Goto NormalErrorHandler
... weiter im Code ...
'Ende Gelaende:
Exit Sub

'Hier kommen die ErrorHandler:
NormalErrorHandler:
... "Normale" Fehlerbehandlung, normalerweise Abbruch der Routine ...
Exit Sub

IchBefuerchteFehler1024:
If Err = 1024 Then
...korrigiere die Situation - ueberpruefe das Resultat!!!
Resume Next   '<- UND NUR SO !!!
Else
Goto NormalErrorhandler
End If
Exit Sub

Ich hoffe, das Grundprinzip konnte ich verständlich machen (und ganz so simpel ist es reell nicht zu kodieren!). Wenn es nicht verstanden wurde: Verwende prinzipiell nicht "Resume Next".
"Resume Next" ist vergleichbar mit folgender Situation: Du merkst bei Vollgas, dass es Dich aus der Kurve trägt. "Resume Next" heisst: Okay, ich habe es festgestellt, aber ich mache weiter so ...

Bernhard

jr:
Hallo Bernhard,

dem kann ich so nicht ganz zustimmen. Wenn der Code steht, und das hatte er seit über zwei Jahren, dann sorgt eine On Error -Klammer dafür, dass selbst bei einem noch so unwahrscheinlichen Fehler, der Code weiter läuft und alles andere trotzdem ausgeführt wird. In meinem Fall heißt das, nach dem Datenbank anlegen, den Titel setzen, Konfigurationsdokumente kopieren, ACL anpassen und Datenbank öffnen. Das hat er auch alles gemacht (bis auf den Datenbanktitel) und der Kunde konnte nach einem weiteren Design-Refresh wie gewohnt weiter arbeiten. Von der Datenbank wurde seit Monaten keine neue Version mehr ausgeliefert. Wahrscheinlich habe ich irgend etwas schon vor langer Zeit verändert, das sich erst jetzt bemerkbar gemacht hat. Und obwohl ich normalerweise alles ausführlich dokumentiere, habe ich dazu nichts gefunden. *schäm*

Also ich glaube nicht, dass ich alle Eventualitäten im Voraus weiß. Wenn der Code reibungslos läuft, dann sorgt der 'On Error Resume Next' dafür, dass der Benutzer auch bei nicht vorhergesehenen Problemchen weiterarbeiten kann.

Natürlich hast Du recht, dass ein Abfangen mit 'On Error Goto ...' eleganter ist, wenn man dann eine schöne Fehlermeldung ausgibt und dann den Code mit Resume Next weiterlaufen lässt. Das ist sicherlich in den meisten Fällen der Fall, aber hier hätte es mir auch nichts genützt, weil der Benutzer mit "Userdefined error" nichts hätte anfangen können. Und, ehrlich gesagt, bei einem db.Title erwarte ich einfach keinen Fehler...

Aber wo ich wirklich falsch lag: Bisher bin ich davon ausgegangen, dass ein 'On Error...' immer nur in der aktuellen Funktion gilt. Das dies aber anscheinend auch noch in einer tieferen Funktion, in einer ganz anderen Bibliothek, gültig ist, war mir nicht bewusst. Da werde ich in Zukunft besser aufpassen müssen.

Nochmals vielen Dank für Deine Unterstützung.

Bis zum nächsten Mal,

Joachim

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln