usar try tipos metodo lanzar excepciones excepcion errores ejemplos controladas como catch capturar bloque c# wcf error-handling

try - WCF/C#No se puede capturar la excepción EndpointNotFoundException



tipos de excepciones en c# (5)

Coloque un bloque try catch en el Método Completado .

Un ejemplo:

... geocodeService.ReverseGeocodeCompleted += ReverseGeocodeCompleted(se, ev); geocodeService.ReverseGeocodeAsync(reverseGeocodeRequest); } private void ReverseGeocodeCompleted(object sender, ReverseGeocodeCompletedEventArgs e) { try { // something went wrong ... var address = e.Result.Results[0].Address; } catch (Exception) { // Catch Exception Debug.WriteLine("NO INTERNET CONNECTION"); }

He creado un servicio y un cliente WCF y todo funciona hasta que se trata de detectar errores. Específicamente, estoy intentando capturar la EndpointNotFoundException para cuando el servidor no esté allí por el motivo que sea. He intentado un simple bloque try / catch para detectar el error específico y la excepción de comunicación de la que se deriva, y he intentado capturar solo la excepción. Ninguno de estos logra capturar la excepción, sin embargo sí obtengo

Se produjo una excepción de primera vez del tipo ''System.ServiceModel.EndpointNotFoundException'' en System.ServiceModel.dll

en la ventana de salida cuando el cliente intenta abrir el servicio. ¿Alguna idea sobre lo que estoy haciendo mal?


Eche un vistazo a esta publicación para obtener detalles sobre esta posible solución. El código muestra el uso de un proxy de generación, pero también es válido en ChannelFactory y en otros.

Patrón típico aquí-be-dragones

using (WCFServiceClient c = new WCFServiceClient()) { try { c.HelloWorld(); } catch (Exception ex) { // You don''t know it yet but your mellow has just been harshed. // If you handle this exception and fall through you will still be cheerfully greeted with // an unhandled CommunicationObjectFaultedException when ''using'' tries to .Close() the client. // If you throw or re-throw from here you will never see that exception, it is gone forever. // buh bye. // All you will get is an unhandled CommunicationObjectFaultedException } } // <-- here is where the CommunicationObjectFaultedException is thrown

Patrón adecuado:

using (WCFServiceClient client = new WCFServiceClient()) { try { client.ThrowException(); } catch (Exception ex) { // acknowledge the Faulted state and allow transition to Closed client.Abort(); // handle the exception or rethrow, makes no nevermind to me, my // yob is done ;-D } }

O, como se expresa en su pregunta sin una declaración de uso,

WCFServiceClient c = new WCFServiceClient(); try { c.HelloWorld(); } catch { // acknowledge the Faulted state and allow transition to Closed c.Abort(); // handle or throw throw; } finally { c.Close(); }



Pude replicar su problema y me interesé (ya que necesitaba el mismo). Incluso busqué una forma de manejar las excepciones de primera oportunidad, pero desafortunadamente no es posible (para código administrado) para .net framework 3.5 y versiones anteriores.

En mi caso, siempre recibo una System.ServiceModel.CommunicationObjectFaultedException cuando algo falla en el servicio o cuando accedo a un servicio inactivo. Resulta que la declaración de using c # es la causa, ya que detrás de la escena, la instrucción de using siempre cierra la instancia del cliente de servicio incluso si ya se encontró una excepción (no salta a la declaración de captura directamente).

Lo que sucede es que la excepción original System.ServiceModel.EndpointNotFoundException será reemplazada por la nueva excepción System.ServiceModel.CommunicationObjectFaultedException cuando el using intente cerrar la instancia del cliente de servicio.

La solución que he creado es no usar la instrucción using , de modo que cada vez que se encuentre una excepción dentro del bloque try, instantáneamente lanzará la excepción a los bloques catch.

Intenta codificar algo como:

DashboardService.DashboardServiceClient svc = new Dashboard_WPF_Test.DashboardService.DashboardServiceClient(); try { svc.GetChart(0); } catch (System.ServiceModel.EndpointNotFoundException ex) { //handle endpoint not found exception here } catch (Exception ex) { //general exception handler } finally { if (!svc.State.Equals(System.ServiceModel.CommunicationState.Faulted) && svc.State.Equals(System.ServiceModel.CommunicationState.Opened)) svc.Close(); }

En lugar de:

try { using (DashboardService.DashboardServiceClient svc = new Dashboard_WPF_Test.DashboardService.DashboardServiceClient()) { svc.GetChart(0); } } catch (System.ServiceModel.EndpointNotFoundException ex) { //handle endpoint not found exception here (I was never able to catch this type of exception using the using statement block) } catch (Exception ex) { //general exception handler }

Y entonces podrás atrapar la excepción correcta.


¿Qué es una excepción de primera oportunidad?

Los mensajes de excepción de primera oportunidad con mayor frecuencia no significan que haya un problema en el código. Para las aplicaciones / componentes que manejan las excepciones con gracia, los mensajes de excepción de primera oportunidad le informan al desarrollador que se encontró una situación excepcional y que se manejó.