vb.net

2012-11-19 42 views
7

में त्रुटि रेखा संख्या को वापस करने के लिए Stacktrace का उपयोग कैसे करें I त्रुटि प्रकार को वापस करने के लिए कुछ प्रकार की त्रुटि पकड़ने की विधि बनाने की कोशिश कर रहा हूं। हमारे पास एक निरस्त ईमेल है जो एक प्रक्रिया बंद होने पर भेजा जाता है जो हमें err.number और err.description देता है लेकिन मैं जानना चाहता हूं कि वास्तव में त्रुटियां कहां से बाहर हैं।vb.net

मैं जानता हूँ कि आप निम्न कर सकते हैं:

1: code here 
2: code here 
3: code here 

आदि और ERL का उपयोग संख्या प्राप्त करने, लेकिन यह उस तरह प्रत्येक पंक्ति बाहर टाइप करने के लिए कठिन हो जाएगा।

क्या स्वचालित रूप से ऐसा करने का कोई तरीका है या क्या स्टैकट्रैक का उपयोग करना आसान होगा? यदि स्टैकट्रैक बेहतर है तो क्या आप मुझे एक उदाहरण दिखा सकते हैं?

+1

ERL VB6 से काम करने के पुराने तरीके से है। क्या TRY/कैच का उपयोग न करने का कोई कारण है? अपवाद ऑब्जेक्ट में एक अच्छा स्टैक ट्रेस है और इसमें लाइन नंबर भी शामिल है। – PatFromCanada

उत्तर

7

अपवाद स्टैक निशान में लाइन संख्या उत्पन्न करना सीएलआर के लिए एक अंतर्निहित सुविधा है। हालांकि आपको एक कोड संख्या को कोड नंबर पर मैप करने के लिए आवश्यक जानकारी प्रदान करना होगा। अपनी परियोजना की रिलीज कॉन्फ़िगरेशन पर स्विच करें। परियोजना + गुण, संकलन टैब, उन्नत संकलन विकल्प। पीडीबी-केवल पूर्ण से "डीबग जानकारी जेनरेट करें" सेटिंग बदलें। अपने प्रोग्राम के साथ .pdb फ़ाइलों को तैनात करें।

सावधान रहें कि आपको प्राप्त होने वाली रेखा संख्या हमेशा एक अनुमान है इसलिए आप जो देखते हैं उस पर भरोसा न करें। मैपिंग ऑप्टिमाइज़र इनलाइनिंग विधियों के कारण मैपिंग अपूर्ण है और अन्यथा प्रोग्राम को तेज़ी से चलाने के लिए चारों ओर कोड ले जा रहा है।

0

आपको निश्चित रूप से स्टैक ट्रेस का उपयोग करना चाहिए, क्योंकि आप वैश्विक अपवाद पकड़ने वाले तंत्र का उपयोग कर सकते हैं जिसे आपको केवल एक बार कोड करने की आवश्यकता होगी।

सटीक रेखा प्राप्त करने के लिए जिस पर त्रुटि फेंक दी गई थी, आपको अपने आवेदन के साथ पीडीबी फाइलों को शिप करने की आवश्यकता होगी। उन पीडीबी फाइलों में त्रुटि की लाइन संख्या सहित डीबग जानकारी होती है।

यदि आप जानना चाहते हैं कि अनचाहे अपवादों को कैसे शानदार तरीके से पकड़ना है, तो this codeproject article पर एक नज़र डालें।

12

मैं दूसरे मंच से एक उदाहरण ढाल लिया है मेरे मामले में, मैं लाइन संख्या जहां त्रुटि के कारण हुई थी नहीं हो रही थी, तो मैं चारों ओर खेलना शुरू कर दिया है और एक समाधान मिल गया है, कोड इस प्रकार है:

Public Class Form1 
    Private Sub a2() 
     Dim b As Integer = 0 
     Dim a As Integer = 1/b 
    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles Button1.Click 
     Try 
      a2() 
     Catch ex As Exception 
      Dim st As New StackTrace(True) 
      st = New StackTrace(ex, True) 
      MessageBox.Show("Line: " & st.GetFrame(0).GetFileLineNumber().ToString, "Error") 
     End Try 
    End Sub 
End Class 

इस उदाहरण में, लाइन 4 त्रुटि अपवाद को ट्रिगर करेगा, लेकिन एक बार जब मैंने वास्तविक जीवन अनुप्रयोग में सिद्धांत लागू किया था, तो लाइन 0 थी, इसलिए मैंने गेटफ्रेम संपत्ति में इंडेक्स के साथ खेलना शुरू किया, यह 0 से 4 तक है , जब मैंने ऑब्जेक्ट में 4 डाल दिया, तो यूरेका, मुझे समस्या का कारण रेखा संख्या मिली।

+1

मैंने वर्तमान एएसपी.NET एप्लिकेशन में यह कोशिश की और यह 1 पर एक इंडेक्स के साथ काम किया ... मेरा अप-मार्क जोड़ा गया :-) – gchq

+0

यह SO उत्तर दिखाता है कि इसे ठीक से कैसे करें: http://stackoverflow.com/a/22338763/737393 – CrazyTim

+1

@gchq कन्स्ट्रक्टर को बूलियन पैरामीटर जोड़ने के लिए मत भूलना। वीबी में स्टैकट्रेस के पैरामीटर रहित कन्स्ट्रक्टर होने पर मेरे लिए यह काम नहीं करता था।नेट वीएस 13 एक्सप्रेस –

-1

आप त्रुटि पर लाइन नंबर पुनर्प्राप्त करने के लिए स्टैकट्रेस का उपयोग कर सकते हैं।

Try 
    'Put your code here 

Catch ex As Exception 
    Dim trace = New Diagnostics.StackTrace(ex, True) 
    Dim line As String = Right(trace.ToString, 5) 
    MessageBox.Show("'" & ex.Message & "'" & " Error in- Line number: " & line) 

End Try 
+0

एक शिलालेख जोड़ें और अपना कोड – SeeuD1

0
Try 
     Dim x As Integer 
     x = " " 

    Catch ex As Exception 
     Dim trace = New Diagnostics.StackTrace(ex, True) 
     Dim line As String = Strings.Right(trace.ToString, 5) 
     Dim nombreMetodo As String = "" 

     For Each sf As StackFrame In trace.GetFrames 
      nombreMetodo = sf.GetMethod().Name & vbCrLf 
     Next 

     MessageBox.Show("Error en Linea number: " & line & vbCrLf & ex.Message & vbCrLf & "Metodos : " & nombreMetodo) 
    End Try 
+0

प्रारूपित करें कृपया उत्तर के रूप में केवल डंपिंग कोड से बचने का प्रयास करें और यह बताएं कि यह क्या करता है और क्यों। आपका कोड उन लोगों के लिए स्पष्ट नहीं हो सकता है जिनके पास प्रासंगिक कोडिंग अनुभव नहीं है। कृपया [उत्तरदायित्व, संदर्भ और अपने उत्तर में किसी सीमा, धारणाओं या सरलीकरणों का उल्लेख करने का प्रयास करने के लिए अपना उत्तर संपादित करें।] (Https://stackoverflow.com/help/how-to-answer) –

0
Try 
     Dim x As Integer 
     x = " " 

    Catch ex As Exception 
     Dim trace = New Diagnostics.StackTrace(ex, True) 
     Dim line As String = Strings.Right(trace.ToString, 5) 
     Dim nombreMetodo As String = "" 
     Dim Xcont As Integer = 0 

     For Each sf As StackFrame In trace.GetFrames 
      Xcont = Xcont + 1 
      nombreMetodo = nombreMetodo & Xcont & "- " & sf.GetMethod().ReflectedType.ToString & " " & sf.GetMethod().Name & vbCrLf 
     Next 

     MessageBox.Show("Error en Linea number: " & line & ex.Message & vbCrLf & "Metodos : " & vbCrLf & nombreMetodo) 

    End Try