SoapException Tidak Tertangkap dalam coba tangkap

Ambil pernyataan coba-tangkap berikut di 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

Dalam metode itu (PerformDailyUpdate) sebuah ASMX-Webservice (.Net 2.0) dipanggil. Layanan web ini kadang-kadang memunculkan SOAPException yang disebabkan oleh metode yang dipanggil dari layanan web itu. Namun entah bagaimana SOAPException ini tidak tertangkap oleh metode di atas.

Pertanyaan Saya: Mengapa SOAPException tidak Tertangkap? Apakah ada beberapa karakteristik yang membedakan Pengecualian SOAP dari 'pengecualian' normal yang dihasilkan (yang pada gilirannya menyebabkannya tidak tertangkap)?

Catatan: Kode yang ditulis di sini bukan milik saya. Jadi Tolong jangan menilai saya berdasarkan hal itu

ExceptionMessage (Bagian pertama)

  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)
  ....

Terima kasih

Scheme (how this clarifies the situation somewhat):

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

Di dalam Layanan WCF, data yang diterima dimanipulasi untuk mengisi tabel tertentu. Layanan AMSX-Web mungkin tidak berubah dalam situasi ini.


person User999999    schedule 30.01.2014    source sumber
comment
Apakah ini kasus di mana kesalahan SOAP terjadi pada host, tetapi Anda mencoba menangkapnya pada klien? Sulit untuk membedakannya dari deskripsinya.   -  person Brian    schedule 30.01.2014
comment
Saya akan mengedit posting saya untuk memperjelas situasinya.   -  person User999999    schedule 30.01.2014
comment
Pertama-tama, jika menggunakan Referensi Layanan (dan Anda harus) maka Anda akan mendapatkan FaultException atau mungkin FaultException<T>, bukan SoapException. Kedua, jika catch (Exception ex) tidak menangkap pengecualian, berarti tidak ada pengecualian yang dilemparkan.   -  person John Saunders    schedule 30.01.2014
comment
menambahkan bagian pertama dari pengecualian yang diberikan   -  person User999999    schedule 30.01.2014


Jawaban (1)


Saya pikir pengecualian normal harus dapat menangkap kesalahan tidak tertangani yang Anda daftarkan, tetapi Anda dapat mencoba pengecualian khusus SOAP, dan/atau terkait SQL, selain pengecualian reguler Anda.

Menyukai:

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
Akan mencoba melakukan ini. Mungkin pertanyaan bodoh dan/atau bodoh (hanya ingin membahas semua basis saya di sini). Gambar saya memiliki pengecualian khusus yang diwarisi dari SOAPException. Di mana ia akan ditangkap? di ekspektasi sabun tangkapan atau pengecualian tangkapan? - person User999999; 30.01.2014
comment
Jika ini merupakan pengecualian khusus, Anda harus menangkap pengecualian spesifik yang mereka berikan menggunakan definisi pengecualian (kelas) yang mereka buat. Itu akan ditemukan di DLL yang mereka gunakan. Anda harus mereferensikannya di proyek Anda untuk menggunakan (menangkapnya). Tapi apa pun yang mewarisi dari pengecualian kelas dasar (apa yang seharusnya mereka lakukan jika mereka membuat kelas pengecualian khusus) harus dapat ditangkap dengan pernyataan coba-tangkap biasa menggunakan Pengecualian e. - person Brian; 30.01.2014
comment
Hal yang sama dengan kelas khusus yang mewarisi SoapException. - person Brian; 30.01.2014
comment
Terima kasih atas penjelasannya! - person User999999; 30.01.2014