Kan man få en On Error Resume Next att gälla över allt i ett program eller måste man skriva det i varje procedur? Använd hellre On Error Goto framför On Error Resume Next om det inte är så att du lässer av Err objektet efter fel. Om det nu skulle ha gått att ha en global On Error så antog jag Resume Next skulle vara den enda möjligheten. Jo, det går att ha en global felhantering. Det där fungerade perfekt! Det är inte vad jag skulle kalla en global felhanterare eftersom den bara klarar av fel som inträffar direkt "under" denna metod. Varje event i t ex ett formulär (form_load,button_click,...) startar en egen call stack som måste hanteras separat. Ta följande kodexempel :On Error Resume Next på allt?
ThomasSv: On Error Resume Next på allt?
Att ignorera fel är mycket fult. Du bör hantera fel som kan uppstå.Sv:On Error Resume Next på allt?
Anledningen till att jag vill ha den globalt är för att jag har ett fel i ett program som jag helt enkelt inte kan hitta. Det uppstår enbart för en del personer och tyvärr inte för mig.
Det problemet tog jag upp i ["Run-time error '364': Object was unloaded"]
ThomasSv: On Error Resume Next på allt?
Vad du gör är helt enkelt att som allra första kodrad i den del av programmet som startas upp först lägger din "on error goto" och då även läser av err objektet för att få reda på vad som hänt.
Poängen är då att om fel inträffar i en underliggande funktion eller klass och det felet inte hanteras så avslutas den aktuella funktionen / klassen och man hoppar baklänges på call stacken tills man hittar en felhanterare.
Detta är varken snyggt eller bra på något sätt. Dessutom är det faktiskt det absolut långsammaste sättet att hantera fel förutom att viss spårdata kan försvinna på vägen.
Tyvärr kan man dock inte i VB6 på ett snyggt och enkelt sätt få ut call stacken så som man kan i VB.Net...
Lycka till!
// JohanSv:On Error Resume Next på allt?
Jag håller på att skriva om hela programmet i .NET så därför nöjer jag mig med en sån här tillfällig lösning i VB6-versionen.
ThomasSv:On Error Resume Next på allt?
Sub Main : Sätt denna som startup-metod
<code>
Option Explicit
Public Sub main()
On Error GoTo hell
FailingMethod
Dim f As Form1
Set f = New Form1
f.Show vbModal
Unload f
Set f = Nothing
Exit Sub
hell:
MsgBox "Ett fel uppstod : " & Err.Description
Resume Next
End Sub
Private Sub FailingMethod
Err.Raise 13 ' Detta fel kommer att fångas
End Sub
</code>
Formulär Form1
<code>
Private Sub Command1_Click()
Err.Raise 13 ' Detta fel fångas ej!
End Sub
Private Sub Form_Load()
Err.Raise 13 ' Detta fel fångas ej!
End Sub
</code>
Inget av ovanstående fejkade fel kommer att fångas av den "globala" felhanteraren. Lösningen blir alltså att lägga en "on error goto" i VARJE eventprocedur också utöver startproceduren och då är den inte så global längre...