Avatar billede hugopedersen Nybegynder
13. februar 2003 - 16:47 Der er 15 kommentarer og
1 løsning

Navnet på aktuelle modul / procedure

Findes der nogen nem måde at finde navnet på en procedure og navnet på det modul der indeholder denne ?

Forklaring :
Til en global errorhandler ville det jo være både nemmere og smartere hvis man kunne kalde den f.eks. fGlobalErrorHandler(fFindModuleName, fFindProcedureName) i stedet for  fGlobalErrorHandler("modModulNummer777", "fFunctionNummer999")

Det vil også minimere chancen for fejl når man opretter linien i alle sine funktioner.

Jeg er rimeligt sikker på at man ikke kan, men hvis der nu skulle være en eller anden der mener anderledes, er jeg meget interesseret.
Avatar billede nih Novice
13. februar 2003 - 17:24 #1
Du kan lave en global error handler ved at sende error objektet til en global procedure:

Function fejl() As Integer

  On Error GoTo ehand
    fejl = 2 / 0
udHer
  Exit Function
ehand:
  globalerror Err
End Function


Sub globalerrorHandler(e As ErrObject)
  MsgBox e.Description

End Sub

Niels
Avatar billede hugopedersen Nybegynder
13. februar 2003 - 17:29 #2
Det kan jeg bare ikke nøjes med da jeg skal bruge procedurenavnet og modulnavnet til at skrive i min fejllog som brugeren kan sende til mig ;-(

I øvrigt så skal man passe meget på med det error object - der skal næsten ingenting til før det resettes uden for den procedure det er opstået i.
Avatar billede nih Novice
13. februar 2003 - 17:36 #3
Er det noget ala det her:

Application.CurrentObjectName

Niels
Avatar billede nih Novice
13. februar 2003 - 23:16 #4
Jeg har fundet en windows API du måske kan arbejde videre på:

The StackWalk function provides a portable method for obtaining a stack trace.

BOOL StackWalk(

    IN DWORD MachineType,   
    IN HANDLE hProcess,   
    IN HANDLE hThread,   
    IN OUT LPSTACKFRAME StackFrame,   
    IN OUT LPVOID ContextRecord,   
    IN PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine,   
    IN PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine,   
    IN PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine,   
    IN PTRANSLATE_ADDRESS_ROUTINE TranslateAddress   
  );   


Parameters

MachineType

The architecture type of the machine for which the stack trace is generated. This can be one of the following values:

·    IMAGE_FILE_MACHINE_I386
·    IMAGE_FILE_MACHINE_R4000
·    IMAGE_FILE_MACHINE_R10000
·    IMAGE_FILE_MACHINE_ALPHA
·    IMAGE_FILE_MACHINE_POWERPC

hProcess

The process handle for which the stack trace is generated. If the caller supplies a valid callback pointer for ReadMemoryRoutine, then this value does not have to be a valid Win32 process handle. It can be a token that is unique and consistently the same for all calls to the StackWalk function. If IMAGEHLP's symbol handler is used with StackWalk
, the process handles used should be the same for the calls to each function.

hThread

The thread handle for which the stack trace is generated. If the caller supplies a valid callback pointer for ReadMemoryRoutine, then this value does not have to be a valid Win32 thread handle. It can be a token that is unique and consistently the same for all calls to the StackWalk function.

StackFrame

A pointer to a STACKFRAME structure. This structure is filled with the next frame's information, if the function call succeeds.

ContextRecord

A pointer to a CONTEXT record. This parameter is required only when MachineType is not equal to IMAGE_FILE_MACHINE_I386.

ReadMemoryRoutine

A pointer to a callback routine that provides memory read services. When the StackWalk function needs to read memory from the process's address space, this callback is used. If NULL is passed, then the Win32 ReadProcessMemory function is used. In this case, the hProcess parameter must be a valid Win32 process handle.

FunctionTableAccessRoutine

A pointer to a callback routine that provides access to the run-time function table for the process. For RISC machines, this function accesses the pdata table, while on X86 machines this function accesses the fpo table. This parameter is required because the StackWalk function does not have access to the process's run-time function table.
The symbol handler in IMAGEHLP provides functions that load and access the run-time table. If these functions are used, then SymFunctionTableAccess can be passed as a valid parameter.

GetModuleBaseRoutine

A pointer to a callback routine that provides a module base for any given virtual address. This parameter is required. The symbol handler in IMAGEHLP provides functions that load and maintain module information. If these functions are used, then SymGetModuleBase can be passed as a valid parameter.

TranslateAddress

A pointer to a callback routine that provides address translation for 16-bit addresses. Most, if not all, callers of StackWalk can safely pass NULL for this parameter.



Return Values

If the function succeeds, the return value is TRUE.
If the function fails, then the return value is FALSE. To retrieve extended error information, call GetLastError.

Remarks

The StackWalk function provides a portable method for obtaining a stack trace. This function is used by all Microsoft Win32 debuggers and tools that require stack trace facilities. Using IMAGEHLP's StackWalk function is recommended over writing your own function because of all the complexities associated with stack walking on the various Win32 platforms. In addition, the various compiler options that cause the stack to appear differently, depending on how the module is compiled, complicate the problem even more. By using this function, your application has a portable stack trace that continues to work when the compiler and operating system change.
Avatar billede nih Novice
13. februar 2003 - 23:20 #5
Her står lidt om den til VB6

http://www.fawcette.com/vsm/2002_05/magazine/columns/blackbelt/default_pf.asp

men jeg kan ikke rigtigt få den til at spille. Den returnere ALLE stakke, man skal på en eller anden måde bgrænse det til det aktive modul.

Jeg gi'r op nu :(

Niels
Avatar billede hugopedersen Nybegynder
14. februar 2003 - 11:09 #6
nih>  Application.CurrentObjectName er det halve af løsningen :-)  Procedurenavnet er måske ikke så nemt at finde.
Avatar billede hugopedersen Nybegynder
22. maj 2003 - 08:11 #7
Ingen komplet løsning - men nih får points for sin indsats
Avatar billede juks Novice
15. oktober 2003 - 22:04 #8
hugo er du stadig interesseret i sådanne en løsning ?
Avatar billede hugopedersen Nybegynder
16. oktober 2003 - 15:15 #9
Absolut - meget interesseret vil jeg gå så vidt at sige.
Avatar billede juks Novice
16. oktober 2003 - 15:17 #10
hvor meget  er int  = $
Avatar billede hugopedersen Nybegynder
16. oktober 2003 - 15:19 #11
Ikke forstået
Avatar billede juks Novice
16. oktober 2003 - 15:22 #12
hvor mange penge
Avatar billede juks Novice
16. oktober 2003 - 15:34 #13
nej pjat  her løsningen skulle bare lige finde den

modul ser således ud
--------------kode start
Dim sMsg, smsg1, tit As String
Dim lContactSystemSupport As Boolean ' denne linje skal være true hvis man skal bruge coped with
Dim lHandled As Boolean
Dim dbs As Database
Dim Rst As DAO.Recordset
Dim ctl As Control
Dim frm As Form

Dim errNumber As Long
Dim errDescription As String

    errNumber = err.Number
    errDescription = err.Description



    On Error Resume Next
   
    Set ctl = Screen.ActiveControl
   
    If err.Number <> 0 Then Set ctl = Screen.PreviousControl
   
    Set frm = Screen.ActiveForm
   
   
    Set dbs = CurrentDb
    Set Rst = dbs.OpenRecordset("Select * from tbl_errorlog ", dbOpenDynaset)
    With Rst
        .AddNew
        !FejlNummer = errNumber
        !Fejlbeskrivelse = errDescription
        !formularnavn = frm.Name
        !Dato = Now()
        !feljcontrol = ctl.Name
        .Update
    End With

tit = "Frisørmanager "

Select Case errNumber
 
Case 2501 'The DoMenuItem action was canceled.
    GoTo Slut ' Ingen fejl behandling
Case 3010
  GoTo Slut
Case Else
   
  sMsg = "Det er opstået en fejl, prøv at lukke programmet og start det igen." & vbCrLf & "hvis det ikke løser problemet kontakt JHC IT-Support + 45 2070 6424 " & _
vbCrLf & errDescription & " " & errNumber
End Select




MsgBox sMsg, , tit





Slut:
end function

--------------------Kode slut
kaldes så ledes



_-------------Kode start

On Error GoTo Err_glob_Click

docmd.something

Exit_glob_Click:
    Exit Sub

Err_glob_Click:

Global_Error_Handler
Resume Exit_glob_Click
End Sub
-------------- kode slut
Avatar billede hugopedersen Nybegynder
17. oktober 2003 - 11:46 #14
Hvis jeg læser din kode rigtigt, så er det du gemmer navnet på en eller anden skærmkontrol der var aktiv da fejlen skete.  Er det helt forkert ?

Det er ikke lige det jeg mangler. Det er til kodemoduler hvor jeg gerne vil kunne sende navnet på aktuelle kodemodul + navnet på proceduren med til errorhandleren. Application.CurrentObjectName giver navnet på kodemodulet, men jeg mangler navnet på proceduren.
Avatar billede juks Novice
17. oktober 2003 - 11:49 #15
jeg får navnet på den form og på den procedure der fejler
Avatar billede hugopedersen Nybegynder
19. oktober 2003 - 19:29 #16
Set ctl = Screen.ActiveControl
.
.
.
!formularnavn = frm.Name
!Dato = Now()
!feljcontrol = ctl.Name

Gør så vidt jeg kan se det at den gemmer navnet på en formular og den kontrol der er aktiv på denne formular. Når jeg skal trappe en fejl sker det lige så tit i noget kode der ligger i et modul og så er det egentlig uinteressant med navne på en kontrol da min kode lige så godt kan blive kaldt fra en kanp på en menu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester