根本没有对函数进行评估的奇怪错误

Posted

技术标签:

【中文标题】根本没有对函数进行评估的奇怪错误【英文标题】:Strange bug where function doesn't get evaluated at all 【发布时间】:2018-05-10 14:29:22 【问题描述】:

我有一个奇怪的情况,我有一个用 c# 编写的 Outlook VSTO 加载项,针对 Outlook 2007 和 2010。加载项在 2007 环境中运行良好。当我按下开始时,它在 Visual Studio (2010) 中的 Outlook 2010 调试模式下也能正常工作。但是,一旦我部署到 UAT,其中一个功能根本不会被评估。

其中一个功能是

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 文件安装它时。在调试模式下,它按预期工作......

【问题讨论】:

很难确切地知道原因,你的空渔并没有多大帮助。也许您的第二个 LogDebug Utils.LogDebug("Msg saved as : " + full_file_name_and_path); 调用失败了?它可以解释为什么不执行下一行。编写适当的异常处理。 任何表明Utils.HandleException("OFE HHTP Ex", ex); TransmitFailed(); 被执行或未被执行的内容?除非其中一个方法引发另一个异常,否则您仍然会吞下异常并继续前进,就好像什么都没发生一样。 【参考方案1】:

空的catch 块可以解释您的问题:引发了异常,您只需忽略它并愉快地继续。

例如,在您部署解决方案后,我可以想象文件权限出现问题。但无论出了什么问题都会被吞没,你永远不会听到它......

要么从那个 catch 块中抛出,要么在抛出之前记录一些东西,但盲目地忽略这样的异常绝不是一个好主意。出了点问题,你得到一个信息异常,你拒绝查看它。

错误:

catch (Exception ex)


奇怪又没用:

catch (Exception ex)

    throw;

经常有用:

catch (Exception ex)

    Logger.Log(ex);
    throw;

【讨论】:

抱歉,catch 块不是空的。为简洁起见,我将其删除。在 catch 块被执行和打印之前线程所花费的时间行 你至少可以暗示 什么 在那里,并指出你如何知道没有抛出异常...... 很抱歉。实际上,在 catch 块之前打印了耗时的调试行。 @swdon 我实际上是在谈论那个调试行之前的catch块。 @swdon 在所有 catch 块中编写异常处理代码(日志记录),以获取有关失败原因的更多信息。

以上是关于根本没有对函数进行评估的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章

没有匹配的函数调用奇怪的错误

C++ 中“覆盖函数的异常规范比基本版本更宽松”的奇怪错误

奇怪的 MSC 8.0 错误:“ESP 的值没有在函数调用中正确保存......”

奇怪的 jags.parallel 错误/避免函数调用中的惰性求值

奇怪的分段错误

显示图像时出现奇怪的错误