Mon objectif ici est d'obtenir des informations de trace de pile à partir d'un assemblage chargé dynamiquement. Si l'assembly chargé dynamiquement renvoie simplement l'erreur à l'appelant, les informations de trace de la pile ne vous indiquent pas l'emplacement dans l'assembly dynamique où l'erreur s'est produite. Si je lance ma propre exception, en passant l'exception originale, elle sera ajoutée en tant qu'exception interne et aura l'information nécessaire. J'essaie d'éviter de changer tous mes assemblages dynamiques pour lancer de nouvelles exceptions. Est-ce que quelqu'un sait un meilleur moyen d'obtenir les informations de trace de pile à partir d'un assembly chargé dynamiquement?Obtention d'informations de trace de pile à partir d'un chargement dynamique
Public Class ErrorPlugin
' Example Function from plug in DLL
Public Function SimpleExample() As Double
Dim RentedUnits As Double = 42
Dim NumberUnits As Double = 0
Try
' Just need to generate exception
Return RentedUnits \ NumberUnits
Catch ex As Exception
' Give's me no Stack Trace infomation.
'Throw
' This will give me Stack Trace infomation,
' but requires adjusting all the plugins.
Throw New Exception("Stop dividing by zero.", ex)
End Try
End Function
End Class
Imports System.Reflection
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim rpt As Object
Dim r As Double
Try
rpt = LoadReport("C:\ErrorPlugin\bin\Debug\ErrorPlugin.dll")
r = rpt.SimpleExample()
Catch ex As Exception
MsgBox(ex.Message & vbCrLf & ex.StackTrace)
If ex.InnerException IsNot Nothing Then
MsgBox(ex.InnerException.StackTrace)
End If
End Try
End Sub
Public Function LoadReport(ByVal FileName As String) As Object
Dim m_ReportAssembly As [Assembly]
Dim m_ReportClass As Type
Dim rpt As Object
Try
m_ReportAssembly = Assembly.LoadFrom(FileName)
For Each m_ReportClass In m_ReportAssembly.GetTypes
If m_ReportClass.Name.ToLower = "ErrorPlugin".ToLower Then
rpt = Activator.CreateInstance(m_ReportClass)
Exit For
End If
Next
Return rpt
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Function
End Class
J'ai changé Throw Ex en Throw et j'ai reçu les mêmes résultats. J'ai également enlevé l'exception de la prise et reçu les mêmes résultats. Il semble que la trace de la pile soit réinitialisée, mais je ne sais pas pourquoi? – Bedwell
Cet exemple est similaire à du code que nous avons en production. Lorsqu'une erreur est générée, elle est enregistrée dans un service Web. Nous examinons donc l'erreur. Si une erreur est générée à partir d'un plug-in (nous en avons environ 200), je ne sais pas quel plug-in a généré l'erreur. Remarque: le plug-in n'enregistre pas l'erreur, la fonction appelant le plug-in gère celle-ci dans une zone centrale. – Bedwell