AW: Fehlerbehandlung - Links
19.07.2010 14:06:51
JogyB
Hallo Rainer,
genau das mit dem "kompliziert" wollte ich ja vermeiden ;). Ich habe nochmal ein Beispiel gebastelt:
Function fehlerTest() As Boolean
Dim errCode As Integer
Const pfAd = "c:\temp\"
Const datei1 = "datei1.xls"
Const datei2 = "datei2.xls"
On Error GoTo errorHandler
errCode = 0
Workbooks.Open (pfAd & datei1)
errCode = 1
With Workbooks(datei1)
.Cells(3, 1) = .Cells(2, 1) / .Cells(1, 1)
End With
Workbooks.Open (pfAd & datei2)
errCode = 2
With Workbooks(datei2)
.Cells(2, 1) = .Cells(1, 1) / Workbooks(datei1).Cells(4, 1)
Workbooks(datei1).Cells(4, 1) = .Cells(3, 1) / .Cells(4, 1)
.Close True
errCode = 1
End With
Workbooks(datei1).Close True
errCode = 0
fehlerTest = True
Exit Function
errorHandler:
' Das müßte noch ein, damit es geht
' Resume endErr
'endErr:
On Error Resume Next
If errCode > 0 Then Workbooks(datei1).Close False
If errCode > 1 Then Workbooks(datei2).Close False
MsgBox ("Fehler bei der Verarbeitung der Dateien")
' zur Veranschaulichung, ist ja schon False beim Aufruf
fehlerTest = False
End Function
So hätte ich es gerne. Gut, in dem Beispiel wäre es jetzt interessant, wo der Fehler aufgetreten ist, in den meisten Anwendungsfällen reicht es mir jedoch, den Absturz des Programmes zu verhindern (der User soll an den Ausgangstabellen nicht von Hand herumpfuschen).
Klar, ich könnte es jetzt natürlich auch so machen:
FFunction fehlerTest2() As Boolean
Dim errCode As Integer
Const pfAd = "c:\temp\"
Const datei1 = "datei1.xls"
Const datei2 = "datei2.xls"
On Error GoTo errorHandler
errCode = 0
Workbooks.Open (pfAd & datei1)
errCode = 1
With Workbooks(datei1)
.Cells(3, 1) = .Cells(2, 1) / .Cells(1, 1)
End With
Workbooks.Open (pfAd & datei2)
errCode = 2
With Workbooks(datei2)
.Cells(2, 1) = .Cells(1, 1) / Workbooks(datei1).Cells(4, 1)
Workbooks(datei1).Cells(4, 1) = .Cells(3, 1) / .Cells(4, 1)
.Close True
errCode = 1
End With
Workbooks(datei1).Close True
errCode = 0
fehlerTest = True
Exit Function
errorHandler:
If errCode > 0 Then Workbooks(datei1).Close False
If errCode > 1 Then Workbooks(datei2).Close False
MsgBox ("Fehler bei der Verarbeitung der Dateien")
' zur Veranschaulichung, ist ja schon False beim Aufruf
fehlerTest = False
End Function
oder so:
Function fehlerTest3() As Boolean
Const pfAd = "c:\temp\"
Const datei1 = "datei1.xls"
Const datei2 = "datei2.xls"
On Error GoTo myError1
Workbooks.Open (pfAd & datei1)
On Error GoTo myError2
With Workbooks(datei1)
.Cells(3, 1) = .Cells(2, 1) / .Cells(1, 1)
End With
Workbooks.Open (pfAd & datei2)
On Error GoTo myError3
With Workbooks(datei2)
.Cells(2, 1) = .Cells(1, 1) / Workbooks(datei1).Cells(4, 1)
Workbooks(datei1).Cells(4, 1) = .Cells(3, 1) / .Cells(4, 1)
.Close True
On Error GoTo myError2
End With
Workbooks(datei1).Close True
On Error GoTo myError1
fehlerTest3 = True
Exit Function
myError3:
Workbooks(datei2).Close False
myError2:
Workbooks(datei1).Close False
myError1:
MsgBox ("Fehler bei der Verarbeitung der Dateien")
' zur Veranschaulichung, ist ja schon False beim Aufruf
fehlerTest3 = False
End Function
Nur hierbei muss ich sehr genau aufpassen, dass ich mich nirgends mit der Fehlerstelle verhasple, sonst ist es mit der Fehlerbehandlungsherrlichkeit vorbei. Das ist einfach der Charme des obigen Codes, falls - und nur in dem Fall - es mich nicht interessiert, wo der Fehler denn genau war.
Oder als anderes Beispiel, im Fehlerfall muss ein Teil des Codes übersprungen werden. Mein erster Gedanke war dann dieser:
Function fehlerTest4() As Integer
On Error GoTo myError1
' Code, bei dem in mehreren Zeilen Fehler entstehen können
' Taucht dort irgendwo ein Fehler auf, so soll der Codeteil
' abgebrochen werden
fehlerTest4 = 2 ' Bitwert, was erfolgreich war
myError1:
' Und hier soll es weitergehen, allerdings können hier auch
' Fehler auftreten
' Das müßte noch ein, damit es geht
' Resume weiTer
'weiTer:
On Error GoTo myError2
' hier kommt nun der weitere Code
fehlerTest4 = fehlerTest4 + 1
Exit Function
myError2:
' da braucht nichts mehr zu passieren, kann einfach raus
End Function
Aber eigentlich müsste man es so lösen:
Function fehlerTest5() As Integer
On Error GoTo myError1
' Code, bei dem in mehreren Zeilen Fehler entstehen können
' Taucht dort irgendwo ein Fehler auf, so soll der Codeteil
' abgebrochen werden
fehlerTest5 = 2 ' Bitwert, was erfolgreich war
weiTer:
' Und hier soll es weitergehen, allerdings können hier auch
' Fehler auftreten
On Error GoTo myError2
' hier kommt nun der weitere Code
fehlerTest5 = fehlerTest5 + 1
Exit Function
myError1:
Resume weiTer
myError2:
' da braucht nichts mehr zu passieren, kann einfach raus
End Function
Wenn es nicht anders geht, dann muss ich es eben irgendwie so machen, letztendlich funktionieren alle Beispiele (1 und 4 natürlich nur, wenn die auskommentierten "Resume"-Befehle hereingenommen werden). Aber wie gesagt, sieht entweder nicht schön aus oder ist umständlich.
Gruß, Jogy