2017-11-27 12 views
0

Outlook 2007と2010を対象にC#で記述されたOutlook VSTOアドインを持っているこの奇妙な状況があります。アドインは2007年の環境で正常に動作します。また、startを押すとVisual Studio(2010)のOutlook 2010でデバッグモードで正常に動作します。しかし、UATにデプロイすると、関数の1つが評価されません。関数が全く評価されない不思議なバグ

機能の1つは、

private static bool HTTPTransmitEmailItem(string username, string email_file_name) 
     { 
      // DEBUG 
      Utils.LogDebug("Got into HTTPTransmitEmailItem"); 
      try 
      { 
       Stopwatch timer = new Stopwatch(); 
       timer.Start(); 
       try 
       { 
        Utils.LogDebug("Msg saved as : " + full_file_name_and_path); 

        if (HTTPPostDataToEP(username, temp_path, email_file_name)) 
        { 
         File.Delete(full_file_name_and_path); 
         return true; 
        } 
        else 
        { 
         Utils.LogWarn("Trans Fail, Storing for later sending. " + email_file_name); 
         //if need start resend timer 
         TransmitFailed(); 
        } 
       } 
       catch (Exception ex) 
       { 
         Utils.HandleException("OFE HHTP Ex", ex); 

    

TransmitFailed(); 


       } 

       timer.Stop(); 
       Utils.LogDebug("Email File Thread took " + timer.ElapsedMilliseconds.ToString() + "(ms)"); 
      } 
      catch (Exception ex) 
      { 
      } 
      return false; 
     } 

ある犯人は一部です:

if (HTTPPostDataToEP(username, temp_path, email_file_name)) 
         { 
          File.Delete(full_file_name_and_path); 
          return true; 
         } 
         else 
         { 
          Utils.LogWarn("Trans Fail, Storing for later sending. " + email_file_name); 
          //if need start resend timer 
          TransmitFailed(); 
         } 

アプリケーションがメソッドHTTPPostDataToEPに入ることはありません...メソッド定義が

private static bool HTTPPostDataToEP(string username, string path, string name) 
     { 
      // DEBUG 
      Utils.LogDebug("Got into HTTPPostDataToEP"); 
      try 
      { 
       var content = new MultipartFormDataContent(); 
       content.Add(new StringContent(username), "userAddress"); 
       content.Add(new StreamContent(File.Open(path + name, FileMode.Open)), "msg", name); 
       // DEBUG 
       Utils.LogDebug("In Line 174 in OutlookTransmitRaw"); 
       var client = new HttpClient(); 
       HttpResponseMessage result = client.PostAsync(Utils.configEndPoint, content).Result; 
       // DEBUG 
       Utils.LogDebug("In Line 178 in OutlookTransmitRaw. Result is " + result); 
       if (result.IsSuccessStatusCode) 
        Utils.LogDebug("Msg Transmit Response : " + result.ToString()); 
       else 
        Utils.LogInfo("Msg Fail Transmit Response: " + result.ToString()); 

       return result.IsSuccessStatusCode; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Failed to dispatch email to API. Caused by ", ex); 
      } 
     } 

ですアプリケーションは例外を発生させません。単にifブロックを通過して実行します。Utils.LogDebug("Email File Thread took " + timer.ElapsedMilliseconds.ToString() + "(ms)");これは、プロジェクトを公開してset.exeファイルを使用してインストールする場合にのみ発生します。デバッグモードでは、期待どおりに動作します。

+0

exactlyy理由を知ることは難しい、あなたの空のキャッチはあまり役に立ちません。おそらく、2番目のLogDebug 'Utils.LogDebug(" + full_file_name_and_path);という名前で保存されたメッセージは失敗しますか?次の行がなぜ実行されないのか説明できます。適切な例外処理を記述してください。 – bradbury9

+1

'Utils.HandleException(" OFE HHTP Ex "、ex);それ以外のものは何も示していません。 TransmitFailed(); 'が実行されたか実行されていませんか?これらのメソッドのいずれかが別の例外をスローしない限り、あなたはまだ何も起こらないかのようにあなたの例外を飲み込んでいきます。 – oerkelens

答えて

1

空のcatchブロックで問題が説明されます。例外が発生し、それを無視して楽しく続けます。

たとえば、ソリューションを展開した後に、ファイルのアクセス許可に問題が発生する可能性があります。しかし、間違っているものは飲み込まれ、あなたはそれについて聞くことはありません...

投げられる前にそのキャッチブロックから投げたり、何かを記録したりしてください。しかし、このような例外を盲目的に無視することは決して良い考えではありません。何かが間違っている、あなたは情報で例外を取得し、あなたはそれを見て拒否します。

間違っ:

catch (Exception ex) 
{ 
} 

奇妙なと役に立た:

catch (Exception ex) 
{ 
    throw; 
} 

便利:

catch (Exception ex) 
{ 
    Logger.Log(ex); 
    throw; 
} 
+0

申し訳ありませんが、そのキャッチブロックは空ではありません。私は簡潔にするためにそれを削除しました。そのcatchブロックの直前のスレッドに関する時間の行は、実行されて印刷されます – swdon

+0

少なくともそこにある_what_をヒントして、例外がスローされないことをどのように知っているかを示すことができます。 – oerkelens

+0

残念です。実際には、デバッグ行にかかる時間はcatchブロックの直前に表示されます。 – swdon