Har ett problem, jag vill komma åt VB's Call Stack (precis som man gör när man debuggar i IDE:t (med CTRL-L) ). Alltså en lista med vilka procedurer som anropats inklusive den senaste. Varför gör du bara inte en egen stack? Klart jag kan göra en egen stack, men jag har en förbannad massa procedurer att gå igenom och ändra i om jag ska producera fram en egen. Centraliserad felhantering innebär inte att det är bra felhanteringen. Du bör skicka felet vidare i din proceduerer så var och en av dem kan ta hand om det o sedan skicka det vidare. Detta är bra felhantering.Call Stack
Har letat febrilt på nätet men inte hittat nåt vettigt, det enda som dök upp var ett API som inte gav så mycket mer egentligen.
<code>
Private Declare Function StackWalk Lib _
"dbghelp" (ByVal MachineType As _
Long, ByVal hProcess As Long, _
ByVal hThread As Long, ByRef _
StackFrame As StackFrame, ByVal _
ContextRecord As Long, ByVal _
ReadMemoryRoutine As Long, ByVal _
FunctionTableAccessRoutine As Long, _
ByVal GetModuleBaseRoutine As Long, _
ByVal TranslateAddress As Long) As Long
</code>
Är det någon som vet nåt mer om detta skulle det uppskattas väldeligen.
/EggetSv: Call Stack
<code>
Private Sub Form_Load()
Const ProcedureName = "Form_Load"
Const Stack = ProcedureName
Call DoStuff(Stack)
End Sub
Public Sub DoStuff(ByVal ParentStack As String)
Const ProcedureName = "DoStuff"
Dim Stack As String
Stack = ParentStack & "/" & ProcedureName
MakeMyDay Stack
End Sub
Public Sub MakeMyDay(ByVal ParentStack As String)
Const ProcedureName = "MakeMyDay"
Dim Stack As String
Stack = ParentStack & "/" & ProcedureName
End Sub
</code>
Eller vad är det behov av att känna till stacken?
Om du ska ha den vid felhantering kan du göra så här:
<code>
Private Sub Form_Load()
On Error GoTo ErrProc
Randomize
If Int(rnd*3) = 1 Then Err.Raise vbObjectError, "Test", "Slumpfel 1"
Call DoStuff()
Exit Sub
ErrProc:
MsgBox "Error: " & Err.Description, TypeName(Me) & ".Form_Load()/" & Err.Source
End Sub
Public Sub DoStuff()
On Error GoTo ErrProc
If Int(rnd*3) = 1 Then Err.Raise vbObjectError, "Test", "Slumpfel 2"
MakeMyDay
Exit Sub
ErrProc:
Err.Raise Err.Number, "DoStuff()/" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
Public Sub MakeMyDay()
On Error GoTo ErrProc
If Int(rnd*3) = 1 Then Err.Raise vbObjectError, "Test", "Slumpfel 3"
Exit Sub
ErrProc:
Err.Raise Err.Number, "MakeMyDay()/" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub
</code>
Vilket oxå är ett mer korrekt sätt att hantera fel.Sv: Call Stack
Jag ska ha det till centraliserad felhantering. Själva grejen var att jag inte vill skriva in namnet på varje procedur i felhanteringskoden.
Fast en liten hjälp är nog om jag kan ta reda på vilken procedur jag befinner mig i för närvarande, kodmässigt alltså.
Alltså <code>TypeName(Me)</code> fast för procedurer istället.
/EggetSv: Call Stack