2016-11-20 9 views
0

メールをダウンロードしてデータベースに格納するために、Azureワーカーロールを作成しようとしています。私はメールサーバーに接続や認証ができないときにいくつかの例外を投げかけていますが、これを捕まえることは機能しません。Azureワーカーロールで例外をキャッチできません

私がスローした例外は、try catchブロックによって捕捉されていません。何故ですか?

私のWorkerロールの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メソッドのキャッチブロックにキャッチされないようにする例外をスローするところです。私はキャッチブロックにキャッチされていない理由を理解しようとしています。 – Maritim

答えて

0

それは、スレッドが実際にクラッシュが、無期限にハングされていない結局のところ。これは、使用している電子メールライブラリOpaqueMailのバグであるように見えます。これは、非SSL POP3またはIMAP接続を確立しようとしたときに発生します。私は自分のGitHubページで開発者にバグを提起しました。

私はSSL接続を強制すると、すべて正常に動作し、スローされた例外は必要なときに捕捉されます。

これをまとめると、スレッドがハングアップするバグがありました。この問題はAzure、非同期メソッドまたは例外処理とは決して関連しませんでした。 OpaqueMailのバグだった。

関連する問題