2011-05-25 21 views
6

Estoy trabajando en algún código para usar HttpWebRequest de forma asíncrona. Si alguno de ustedes alguna vez ha hecho esto antes, entonces saben que el manejo de errores puede ser un poco molesto porque si se lanza una excepción en uno de los métodos de devolución de llamada, no se puede volver a pasar al código de llamada a través de un intento/catch block¿Cuál es la mejor forma de manejar excepciones asíncronas de HttpWebRequest en C#?

Lo que quiero hacer es manejar los errores guardando las excepciones en mi objeto de estado que se pasan a cada método de devolución de llamada. Si se detecta una excepción, el objeto de estado se actualizará y luego la llamada http se cancelará. El problema que tengo es que en mi objeto de estado, tengo que usar una propiedad de excepción para que se pueda almacenar cualquier tipo de excepción. Cuando el código de llamada comprueba el objeto de estado y "ve" una excepción, no sabe qué tipo de excepción es.

¿Hay alguna forma de permitir que mi objeto de estado retenga cualquier tipo de excepción pero mantenga la excepción fuertemente tipada?

Estado objeto

public class HttpPostClientAsyncModel 
    { 
     public HttpResponseSnapshot Response { get; set; } 
     public HttpPostClientAsyncStatus Status { get; set; } 
     public Exception Exception { get; set; } 
     public WebRequest Request { get; set; } 
    } 
+0

El código de llamada sólo se ponían model.Exception dentro de un bloque try y luego configuración de las capturas de los subtipos de Excepción específicos que la persona que llama puede manejar de manera apropiada. O tal vez no ... :) – dlev

+0

¿Es solo para la experiencia de aprendizaje? ¿Qué pasa con 'HttpWebRequest.BeginGetResponse'? –

Respuesta

1

El objeto de excepción está siendo fuertemente tipado y conserva sus valores originales de campo. Todo lo que necesita es para comprobar de esta manera:

if (asyncModel.Exception is ArgumentException) 
{ 
    // Handle argument exception here 
    string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName; 
} 
else if (...) 
{ 
} 

que lo haría un cheque muy similar con bloque try/catch de todos modos así que esto no debería ser un inconveniente. Si usted está realmente preocupado por esto, basta con crear un nuevo hilo con los métodos de sincronización y de manejar la excepción con opciones de continuación:

Task.Factory.StartNew(() => { DoWork(); }) 
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception), 
TaskContinuationOptions.OnlyOnFaulted); 
Cuestiones relacionadas