2016-11-20 90 views
0

我正在尝试创建Azure工作者角色以下载电子邮件并将它们存储在数据库中。当我无法连接邮件服务器或使用邮件服务器进行身份验证时,我会抛出一些例外情况,但捕获这些邮件不起作用。无法捕获Azure工作者角色中的异常

我抛出的异常没有被try catch块捕获。这是为什么?我的辅助角色

的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

将while循环放入try catch中。这将确保其他语句不会抛出异常。 –

+0

@BrendanGreen我已经在GetNewEmails()内部创建了断点,并通过逐步遍历我到达imapClient.Connect()的代码,然后停止。这是因为这是我抛出异常的地方,它最终没有被我的RunAsync方法中的catch块捕获。我试图弄清楚为什么它没有被捕获到。 – Maritim

回答

0

事实证明该线程实际上没有崩溃,而是无限期地挂起。这似乎是我使用的电子邮件库中的一个错误,OpaqueMail,当您尝试建立非SSL POP3或IMAP连接时发生。我在他们的GitHub页面上向开发者提出了一个错误。

当我强制SSL连接时,一切都按预期工作,抛出的异常被捕获,因为它们应该是。

所以总结起来,一个错误导致线程挂起,问题从未涉及到Azure,异步方法或异常处理。这是一个不透明的邮件错误。

相关问题