Domino 9 und frühere Versionen > ND6: Entwicklung
Error Handling für @PostedCommand([FileOpenDBRepID];DB;Server)
koehlerbv:
Hallo Bastian,
ich würde es folgendermassen machen (beachte bitte die Verlegung des spezifischen ErrorHandlings):
On Error Goto ErrorHandler
Dim workspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.document
Dim strServer As String
Dim vReplicaID As Variant
Dim strReplicaID As String
Dim strPathname As String
strServer = doc.Server(0)
vReplicaID = doc.ReplicaID
Dim oldvalue(0) As String
Dim newvalue(0) As String
oldvalue(0) = ":"
newvalue(0) = ""
newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
strReplicaID = newvReplicaID(0)
Dim db As New NotesDatabase( "", "" )
Call db.OpenByReplicaID( strServer, strReplicaID )
On Error 4060 Goto ErrorAccess
If Not db.Isopen Then
Print "Fehler bei Öffnen","Error"
Else
On Error Goto ErrorHandler
strPathname = doc.Pathname(0)
Call workspace.OpenDatabase( strServer, strPathname )
End If
On Error Goto ErrorHandler
GoOut:
Exit Sub
ErrorHandler:
Msgbox "Error #" & Err & " — " & Error$ & " (line: " & Erl & ")"
Resume GoOut
ErrorAccess:
Msgbox "Zugriffsverletzung"'
Resume GoOut
Damit verlegst Du das spezifische ErrorHandling genau an die Stelle, an der "es" passieren könnte. Ansonsten: Das Resume - wie Du es einsetzt - ist entscheidend, genauso, wie Du es eingesetzt hast. Sonst schleppst Du den aufgetretenen Error in das aufrufende Modul weiter, und es wäre zunächst unklar, warum denn der Fehler angeblich dann in dieser Routine aufgetreten ist (dies nur als Anmerkung für Forumsmitglieder, die diesen Thread später einmal lesen).
Ich hoffe, Dir noch ein klein wenig geholfen zu haben.
Bernhard
koehlerbv:
--- Zitat von: SKL74 am 27.09.05 - 21:26:49 ---@koehlerbv: Wo kriegst Du eigentlich immer die ErrorCode her? Gabs da nicht eine Datei, in der sowas steht?
--- Ende Zitat ---
Sorry, ich habe nicht zu Ende gelesen bei Beantwortung Deines Postings: Die ErrorCodes stehen in .lss-Datein im Notes-Programmverzeichnis und können (wahlweise) per %INCLUDE eingebunden werden:
LSXBEERR.LSS - Konstanten für Backend-Fehlermeldungen
LSXUIERR.LSS - Konstanten für Frontend-Fehlermeldungen
LSERR.LSS - hm, etwas exotisch: "Historische Fehlermeldungen" (V2 und V3 :))
Bernhard
flaite:
Wieso die Erroraufrufe über den Code zerstreuen?
--- Code: ---On Error Goto ErrorHandler
Dim workspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.document
Dim strServer As String
Dim vReplicaID As Variant
Dim strReplicaID As String
Dim strPathname As String
strServer = doc.Server(0)
vReplicaID = doc.ReplicaID
Dim oldvalue(0) As String
Dim newvalue(0) As String
oldvalue(0) = ":"
newvalue(0) = ""
newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
strReplicaID = newvReplicaID(0)
Dim db As New NotesDatabase( "", "" )
Call db.OpenByReplicaID( strServer, strReplicaID )
If Not db.Isopen Then
Print "Fehler bei Öffnen","Error"
Else
strPathname = doc.Pathname(0)
Call workspace.OpenDatabase( strServer, strPathname )
End If
GoOut:
Exit Sub
ErrorHandler:
if err = 4060 then
msgbox "Zugriffsverletzung"
else
Msgbox "Error #" & Err & " — " & Error$ & " (line: " & Erl & ")"
end if
Resume GoOut
--- Ende Code ---
und zwar aus dem einfachen Grund, dass die einzige Stelle an der 4060 auftreten kann, eben die Stelle ist, wo versucht wird auf die andere Datenbank zuzugreifen.
Für meinen Geschmack lenken diese vielen Erroraufrufe vom eigentlichen funktionalen Code ab und das ist so übersichtlicher.
koehlerbv:
Du hast vollkommen Recht, Axel - vorausgesetzt, der Code läuft nicht in einer Schleife ab. Und in diesem Fall soll wirklich nur eine DB geöffnet werden.
Mea culpa.
Bernhard
theBastian:
Hi,
hier gab es ja noch echt Resonanz heute nacht. Müßt Ihr nicht auch mal schlafen? ;)
So, jetzt aber:
--- Code: ---Sub Click(Source As Button)
On Error Goto ErrorHandler
Dim workspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.document
Dim strServer As String
Dim vReplicaID As Variant
Dim strReplicaID As String
Dim strPathname As String
strServer = doc.Server(0)
vReplicaID = doc.ReplicaID
Dim oldvalue(0) As String
Dim newvalue(0) As String
oldvalue(0) = ":"
newvalue(0) = ""
newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
strReplicaID = newvReplicaID(0)
Dim db As New NotesDatabase( "", "" )
Call db.OpenByReplicaID( strServer, strReplicaID )
If Not db.Isopen Then
Msgbox "Es ist ein Fehler aufgetreten." ,64,"Error"
Else
strPathname = doc.Pathname(0)
Call workspace.OpenDatabase( strServer, strPathname )
End If
exitScript:
Exit Sub
ErrorHandler:
If Err = 4060 Then
Msgbox "Es ist ein Fehler aufgetreten." & Chr(10) & Chr(10) _
& "Sie sind zum Zugriff auf diese Datenbank nicht berechtigt." & Chr(10) _
& "Bitte wenden Sie sich an Ihren Administrator." ,64,"Error"
Resume exitScript
Else
Msgbox "Es ist ein Fehler aufgetreten." & Chr(10) & Chr(10) _
& "Fehlermeldung: " & Error$ & Chr(10) _
& "Fehlernummer: " & Err & Chr(10) _
& "Codezeile: " & Erl & Chr(10) _
,64,"Error"
Resume exitScript
End If
End Sub
--- Ende Code ---
Wenn ich jetzt "If Not db.Isopen Then" noch dazu kriegen könnte, einen richtigen Fehler auszuwerfen, und dann zum ErrorHandler zu springen, damit auch die Codezeile angegeben wird, wäre ich total glücklich.
cu
der B@sti
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln