private static MessageStatus RunUnderExplicitExceptionHandler(IMessageConverter converter, StoreDriverDelegate workerFunction) { MessageStatus messageStatus = MessageStatus.Success; StorageExceptionHandler.diag = converter.Tracer; try { workerFunction(); } catch (StoreDriverAgentRaisedException ex) { if (ex.InnerException == null) { TraceHelper.TraceFail(StorageExceptionHandler.diag, 0L, "StoreDriverAgentRaisedException's InnerException is null. It is expected to contain the actual exception that the agent has thrown. StoreDriverAgentRaisedException.Message: {0}; StoreDriverAgentRaisedException.StackTrace: {1}.", new object[] { ex.Message, ex.StackTrace }); throw; } if (ex.InnerException is StoreDriverAgentTransientException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StoreDriverAgentTransientException)ex.InnerException); } else if (ex.InnerException is SmtpResponseException) { messageStatus = StorageExceptionHandler.ProcessSmtpResponseException((SmtpResponseException)ex.InnerException, converter); } else if (ex.InnerException is ADTransientException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (ADTransientException)ex.InnerException); } else if (ex.InnerException is DataValidationException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (DataValidationException)ex.InnerException); } else if (ex.InnerException is DataSourceOperationException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (DataSourceOperationException)ex.InnerException); } else if (ex.InnerException is StorageTransientException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StorageTransientException)ex.InnerException); } else if (ex.InnerException is StoragePermanentException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (StoragePermanentException)ex.InnerException); } else if (ex.InnerException is ExchangeDataException) { messageStatus = StorageExceptionHandler.ProcessExchangeDataException((ExchangeDataException)ex.InnerException, converter); } else { if (!(ex.InnerException is IOException)) { throw; } messageStatus = StorageExceptionHandler.GetMessageStatus(converter, (IOException)ex.InnerException); } if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (StoreDriverAgentTransientException storeDriverAgentTransientException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storeDriverAgentTransientException); } catch (SmtpResponseException smtpResponseException) { messageStatus = StorageExceptionHandler.ProcessSmtpResponseException(smtpResponseException, converter); } catch (ADTransientException unavailableException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, unavailableException); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (DataValidationException invalidDataException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, invalidDataException); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (DataSourceOperationException dataSourceOperationException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, dataSourceOperationException); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (StorageTransientException storageException) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storageException); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (StoragePermanentException storageException2) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, storageException2); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (ExchangeDataException exchangeDataException) { messageStatus = StorageExceptionHandler.ProcessExchangeDataException(exchangeDataException, converter); if (messageStatus.Action == MessageAction.Throw) { throw; } } catch (IOException e) { messageStatus = StorageExceptionHandler.GetMessageStatus(converter, e); if (messageStatus.Action == MessageAction.Throw) { throw; } } return(messageStatus); }