Domino 9 und frühere Versionen > ND7: Entwicklung
On Error Befehl wird ignoriert
Demian:
Moin, moin alle zusammen.
seit zwei drei Monaten befasse ich mich auch mit der Notes-Entwicklung. Bisher habe ich nur unter Excel, Word und Visual .Net programmiert.
Ich habe mir in Notes eine Prozedur geschrieben, um alle Kontakte in eine Excel-Tabelle auszulesen.
Ich musste jedoch feststellen, dass er die On Error anscheinend nur einmal ausführt und beim zweiten Fehler einfach ignoriert.
Hier erst mal mein Code:
Sub Click(Source As Button)
On Error Goto Fehler
'Allgemein
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim feld As NotesItem
'Schleife
Dim i As Long
'Sonstiges
Dim ex
Set db = s.GetDatabase("", "Names.nsf")
Set view = db.GetView("People")
Set ex = getobject(,"Excel.Application")
Weiter:
ex.workbooks.add
ex.visible = True
With ex.range("a1")
.value = "Anrede"
.font.bold = True
End With
With ex.range("b1")
.value = "Vorname"
.font.bold = True
End With
With ex.range("c1")
.value = "Nachname"
.font.bold = True
End With
With ex.range("d1")
.value = "Straße"
.font.bold = True
End With
With ex.range("e1")
.value = "PLZ"
.font.bold = True
End With
With ex.range("f1")
.value = "Ort"
.font.bold = True
End With
ex.Range("a2").Select
Set doc = view.GetFirstDocument
For i = 0 To db.AllDocuments.Count
Set feld = doc.GetFirstItem("Title")
If feld.Text = "Mr." Then ex.ActiveCell.Value = "Herrn"
If feld.Text = "Ms." Then ex.ActiveCell.Value = "Frau"
If feld.text = "Mrs." Then ex.ActiveCell.Value = "Frau"
If feld.text = "Miss" Then ex.ActiveCell.Value = "Frau"
Set feld = doc.GetFirstItem("Firstname")
ex.ActiveCell.Offset(0, 1).Value = feld.Text
Set feld = doc.GetFirstItem("Lastname")
ex.ActiveCell.Offset(0, 2).Value = feld.Text
Set feld = doc.GetFirstItem("Streetaddress")
ex.ActiveCell.Offset(0, 3).Value = feld.Text
Set feld = doc.GetFirstItem("ZIP")
ex.ActiveCell.Offset(0, 4).Value = feld.Text
Set feld = doc.GetFirstItem("City")
ex.ActiveCell.Offset(0, 5).Value = feld.Text
ex.ActiveCell.Offset(1, 0).Select
Set doc = view.GetNextDocument(doc)
Next i
Exit Sub
Fehler:
If Err() = 208 Then
Set ex =createobject("Excel.Application")
Goto Weiter
Else
Exit Sub
End If
End Sub
Der 1. Fehler (Nr.:208) tritt auf, wenn Excel nicht gestartet ist. Er springt dann wunderbar in die Fehlerprozedur, führt diese aus und springt zurück.
Der 2. Fehler (Nr.:91) tritt in der Schleife auf, weil in der Kontaktdatenbank Zertifikate sind, die natürlich nicht über die angegebenen Felder wie Anrede usw. verfügen. Hier soll er den Code einfach unterbrechen.
Genau das tut er aber nicht, sondern wirft eine Notes-Fehlermeldung aus, die sich nicht abfangen lässt.
Wenn Excel jedoch schon gestartet ist, und somit der 1. Fehler ausbleibt, funktioniert die Fehlerroutine einwandfrei.
Für mich sieht das so aus, als würde er die On Error Meldung nur einmal ausführen, aber das wäre ja fatal.
Ich hoffe, dass jemand schon mal einen ähnlichen Fall hatte, bzw. weiß woran es liegt und wie man es umgehen kann.
Für eure Hilfe im Voraus vielen Dank.
Gruß
Demian
Glombi:
Wegen
Exit Sub
wird ja der Code beendet. Notes handelt also korrekt (auch wenn man es kaum glauben mag).
Es muss also so sein:
Fehler:
If Err() = 208 Then
Set ex =createobject("Excel.Application")
Goto Weiter
Else
Resume next
End If
End Sub
Andreas
Demian:
Hallo Glombi,
der Code soll ja bei dem Fehler 91 beendet werden, aber genau das tut er nicht. Der Code läuft weiter und in der ersten Zeile innerhalb der For-Schleife kommt die Fehlermeldung 91, weil das Feld Anrede in den Zertifikaten nicht vorhanden ist. Die Notesfehlermeldung soll ja mit exit sub unterdrückt werden. Aber er springt erst gar nicht mehr in die Fehlerroutine. Nur wenn Excel schon vor Beginn der Prozedur gestartet war, tut er das. Anscheinend, weil es dann der 1. Fehler und nicht der 2. innerhalb der Prozedur ist.
Gruß
Demian
Axel:
Schau mal hier: Best Practices: Error Handling in Lotus Script
Vielleicht findest du hier noch Infos, die dir weiterhelfen.
Axel
koehlerbv:
Hallo Demian (heisst Du wirklich so?),
Andreas aka "Glombi" hat es schon geschrieben: Mit einem simplen "Exit Sub" in einer Fehlerroutine löst Du den Fehler nicht auf - Du schickst ihn "ungebremst" an die aufrufende Instanz (hier: Der Notes-Client).
Ein simples "Resume" vor dem Exit Sub oder die Abfrage von Err (mit einer Ausgabe der Meldung zum Beispiel - aber das wäre hier ungeschickt) würde Err wieder auf 0 setzen.
Insgesamt ist Dein Code aber ungeschickt. Warum überprüftst Du die instantiierten Items nicht auf Verfügbarkeit?
--- Code: ---Set feld = doc.GetFirstItem("Title")
If not (feld Is Nothing) Then ...
--- Ende Code ---
Aber es geht noch einfacher:
Statt
--- Code: ---Set feld = doc.GetFirstItem("Firstname")
ex.ActiveCell.Offset(0, 1).Value = feld.Text
--- Ende Code ---
--- Code: ---szReadString = doc.FirstName (0)
ex.ActiveCell.Offset(0, 1).Value = szReadString
--- Ende Code ---
Wenn das Item jetzt nicht existiert, bekommst Du einen Leerstring zurück - die Excelsheet-Zelle bleibt leer.
Was mir allerdings unklar ist: Warum erwartest Du Zertifikate in der Ansicht "People"? Die kommen dort doch gar nicht vor.
By the way: Dein Script scheiterte bei mir ausgerechnet beim Adressbucheintrag von Andreas Glombitza, weil es dort das Item "StreetAddress" nicht gibt (irgendwie mal importiert) ;D
Noch ein Hinweis: Deine Fehlerbehandlungsroutine wegen nicht laufenden Excel ist "etwas" blauäugig: Was machst Du, wenn ein Anwender Excel gar nicht oder falsch installiert hat? Dann heisst es: "In Ewigkeit - Amen!" sprach die Endlosschleife ...
HTH.
Bernhard
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln