2016-11-20 8 views
0

Я пытаюсь создать роль Azure Worker для загрузки электронных писем и сохранения их в базе данных. Я бросаю некоторые исключения, когда я не могу подключиться или аутентифицироваться с почтовым сервером, но ловить их не работает.Невозможно поймать исключение в роли Azure Worker

Исключения, которые я бросаю, не попадают в блок catch try. Почему это?

RunAsync метод моего работника роли:

private async Task RunAsync(CancellationToken cancellationToken) 
    { 
     // TODO: Replace the following with your own logic. 
     while (!cancellationToken.IsCancellationRequested) 
     { 
      Trace.TraceInformation("Working"); 

      var emailManager = new EmailManager(); 
      var emails = new List<Email>(); 

      try 
      { 
       emails = emailManager.GetNewEmails("outlook.office365.com", 993, "email", "password"); 
      } 
      catch(Exception ex) 
      { 
       Trace.TraceInformation("Error"); 
      } 

      await Task.Delay(1000); 
     } 
    } 

EmailManager.GetNewEmails()

public List<Email> GetNewEmails(string server, ushort port, string username, string password) 
    { 
     var imapClient = new ImapClient(server, port, username, password, false); 
     if (!imapClient.Connect()) 
      throw new Exception("Unable to connect to server."); 
     if (!imapClient.Authenticate()) 
      throw new Exception("Unable to authenticate with server."); 

     var messages = imapClient.GetMessages(); 
     var emails = Mapper.Map<List<MailMessage>, List<Email>>(messages); 

     return emails; 
    } 
+0

Вы уверены, что ваш конструктор 'EmailManager()' не выбрасывает исключение? –

+0

Положите петлю внутри попытки поймать. Это позволит убедиться, что другие утверждения не выбрасывают исключение. –

+0

@BrendanGreen У меня есть точки останова, попавшие внутрь GetNewEmails(), и, пройдя через код, я получаю imapClient.Connect(), а затем он останавливается. Это потому, что это то, где я бросаю исключение, которое заканчивается тем, что не поймано блоком catch в моем методе RunAsync. Я пытаюсь понять, почему это не поймано в блоке catch. – Maritim

ответ

0

Как выясняется, поток не на самом деле сбой, но висит на неопределенный срок. Это, похоже, ошибка в используемой электронной библиотеке, OpaqueMail, которая возникает, когда вы пытаетесь установить соединение без протокола POP3 или IMAP. Я поднял ошибку с разработчиком на их странице GitHub.

Когда я подключаю SSL-соединение, все работает так, как ожидалось, и исключения, которые выбрасываются, пойманы, как и должно быть.

Чтобы подвести итог, ошибка заставила поток зависать, проблема никогда не была связана с Azure, асинхронными методами или обработкой исключений. Это была ошибка OpaqueMail.

 Смежные вопросы

  • Нет связанных вопросов^_^