Domino 9 und frühere Versionen > ND7: Entwicklung

On Error Befehl wird ignoriert

(1/2) > >>

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