根本没有对函数进行评估的奇怪错误
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 文件安装它时。在调试模式下,它按预期工作......
【问题讨论】:
很难确切地知道原因,你的空渔并没有多大帮助。也许您的第二个 LogDebugUtils.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 块中编写异常处理代码(日志记录),以获取有关失败原因的更多信息。以上是关于根本没有对函数进行评估的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章
奇怪的 MSC 8.0 错误:“ESP 的值没有在函数调用中正确保存......”