SoapException ไม่ติดอยู่ใน try catch

ใช้คำสั่ง try-catch ต่อไปนี้ใน WCF-Service

    Try
        'Here some method is being called.
        Return myBs.PerformDailyUpdate()

    Catch ex As Exception 'Exception is not being caught here
        If service IsNot Nothing AndAlso service.HasWarnings Then
            TextFileTracer.Write(String.Format("Warning in method: '{0}'.", name))
            TextFileTracer.Write(service.GetWarnings)
        End If
        Try
            TextFileTracer.Write("Error in dbmanager: " & service.HasErrors.ToString)
        Catch ex2 As Exception
        End Try
        TextFileTracer.Write(String.Format("Error in method: '{0}'.", name))
        TextFileTracer.Write(ex.Message & vbCrLf & ex.StackTrace)
    End Try
End Function 'Exception shows here while debugging

ในเมธอดนั้น (PerformDailyUpdate) จะมีการเรียก ASMX-Webservice (.Net 2.0) บริการเว็บนี้ส่ง SOAPException เป็นครั้งคราวซึ่งเกิดจากวิธีการที่ถูกเรียกจากบริการเว็บนั้น อย่างไรก็ตาม SOAPException นี้ nog ถูกจับโดยวิธีการข้างต้น

คำถามของฉัน: เหตุใด SOAPException จึงไม่ถูกจับ มีคุณสมบัติบางอย่างที่แยก SOAP-Exception ออกจาก 'ข้อยกเว้น' ปกติที่สร้างขึ้น (ซึ่งจะทำให้ตรวจไม่พบ) หรือไม่

หมายเหตุ: รหัสที่เขียนที่นี่ไม่ใช่ของฉัน ดังนั้นโปรดอย่าตัดสินฉันในเรื่องนั้น

ข้อความยกเว้น (ส่วนแรก)

  System.Web.Services.Protocols.SoapException: Unexpected application error: SqlException.
  ADF.ExceptionHandling.GlobalExceptions.UnexpectedException: Unexpected application error: SqlException.
  System.Data.SqlClient.SqlException: Incorrect syntax near ')'.
  at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
  at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
  ....

ขอบคุณ

Scheme (how this clarifies the situation somewhat):

Internal DailyTriggerMechanism  -----> WCF - Service  ----->  ASMX-Webservice        ----> DB2/SQL
                                     (Origin code above)    (Exception being thrown)

ภายใน WCF-Service ข้อมูลที่ได้รับจะถูกจัดการเพื่อเติมตารางเฉพาะ AMSX-Webservice อาจไม่เปลี่ยนแปลงในสถานการณ์นี้


person User999999    schedule 30.01.2014    source แหล่งที่มา
comment
นี่เป็นกรณีที่ข้อผิดพลาด SOAP เกิดขึ้นบนโฮสต์ แต่คุณพยายามตรวจจับข้อผิดพลาดนั้นบนไคลเอนต์หรือไม่ มันยากที่จะบอกจากคำอธิบาย   -  person Brian    schedule 30.01.2014
comment
ฉันจะแก้ไขโพสต์ของฉันเพื่อชี้แจงสถานการณ์   -  person User999999    schedule 30.01.2014
comment
ก่อนอื่น หากใช้การอ้างอิงบริการ (และคุณ ควร) คุณจะได้รับ FaultException หรืออาจจะเป็น FaultException<T> ไม่ใช่ SoapException ประการที่สอง ถ้า catch (Exception ex) ไม่พบข้อยกเว้น นั่นหมายความว่าไม่มีข้อยกเว้นเกิดขึ้น   -  person John Saunders    schedule 30.01.2014
comment
เพิ่มส่วนแรกของข้อยกเว้นที่กำหนด   -  person User999999    schedule 30.01.2014


คำตอบ (1)


ฉันคิดว่าข้อยกเว้นปกติควรจะสามารถจับข้อผิดพลาดที่ไม่สามารถจัดการได้ที่คุณระบุไว้ แต่คุณอาจลองใช้ข้อยกเว้นเฉพาะ SOAP และ/หรือ SQL ที่เกี่ยวข้องกับข้อยกเว้นนอกเหนือจากข้อยกเว้นปกติของคุณ

ชอบ:

try {
    //your failing code
} 
catch (SOAPException se) 
{
   //your response    }
catch (SQLException sqle) 
{
   //your response     
}
catch (Exception e) 
{
   //your response     
}
person Brian    schedule 30.01.2014
comment
จะพยายามทำเช่นนี้. บางทีอาจเป็นคำถามที่งี่เง่าและ/หรืองี่เง่า (แค่อยากจะครอบคลุมฐานทั้งหมดของฉันที่นี่) รูปภาพฉันมีข้อยกเว้นแบบกำหนดเองที่สืบทอดมาจาก SOAPException จะจับได้ที่ไหน? ที่ความคาดหวังสบู่จับหรือข้อยกเว้นการจับ? - person User999999; 30.01.2014
comment
หากเป็นข้อยกเว้นแบบกำหนดเอง คุณจะต้องตรวจสอบข้อยกเว้นเฉพาะที่พวกเขากำลังทิ้งโดยใช้คำจำกัดความข้อยกเว้น (คลาส) ที่พวกเขาสร้างขึ้น ซึ่งจะพบได้ใน DLL ที่พวกเขาใช้อยู่ คุณจะต้องอ้างอิงมันในโครงการของคุณเพื่อใช้ (จับ) แต่สิ่งใดก็ตามที่สืบทอดมาจากข้อยกเว้นคลาสพื้นฐาน (สิ่งที่พวกเขาควรทำหากพวกเขาสร้างคลาสข้อยกเว้นแบบกำหนดเอง) ควรสามารถจับได้โดยการลอง catch สถานะปกติโดยใช้ Exception e - person Brian; 30.01.2014
comment
สิ่งเดียวกันกับคลาสแบบกำหนดเองที่สืบทอด SoapException - person Brian; 30.01.2014
comment
ขอบคุณสำหรับคำอธิบาย! - person User999999; 30.01.2014