我在帮助程序类中有一个静态方法,通过电子邮件发送给管理员以通知错误。在发送电子邮件之前,我会检查是否在web.config中提供了必要的电子邮件地址。
当第一个String.IsNullOrEmpty运行时,将跳过if后面的语句。但是,第二个if后的语句执行。在
在这两种情况下,我都能够在Visual Studio调试器中检查相应的电子邮件变量,并且我可以验证每个变量中是否包含实际的电子邮件地址。我还调试了没有设置手表,只是为了确保手表没有效果。
此外,我尝试在if后面的每个语句周围放置{},但这并未改变行为。
如果我改变这些if语句的顺序,就会发生同样的事情;跳过第一个投掷,但第二个投掷会执行。
在写这篇文章时,我注意到将控制台上的Console.WriteLine向下移动会导致一切按预期工作。不过,我仍然很好奇,如果我留下下面发布的代码,为什么会发生这种情况。能够在将来避免这个问题会很高兴!
方法:
public static bool NotifyAdmin(string subject, Exception e, string additionalInfo = "")
{
String message = String.Format("Exception Message: {0}\n\nStackTrace:\n{1}\n\nAdditional Info:\n{2}", e.Message, e.StackTrace, additionalInfo);
Console.WriteLine(message);
String adminEmail = ConfigurationManager.AppSettings["adminEmail"];
String programEmail = ConfigurationManager.AppSettings["programEmail"];
// Check to ensure that the necessary app settings have been provided
if (String.IsNullOrEmpty(adminEmail))
throw new Exception("adminEmail not specified in AppSettings.");
if (String.IsNullOrEmpty(programEmail))
throw new Exception("programEmail not specified in AppSettings.");
try
...
}
web.config
中存储的信息:
<configuration>
<appSettings>
<add key="adminEmail" value="person1@company.com;person2@company.com"/>
<add key="programEmail" value="program@company.com"/>
</appSettings>
...
此外,我删除了try..catch
块,让方法结束,并且工作正常:
...
if (String.IsNullOrEmpty(programEmail))
throw new Exception("programEmail not specified in AppSettings.");
return true;
}
但是,如果我尝试最小的情况,第二个throw
仍然会发生:
if (String.IsNullOrEmpty(programEmail))
throw new Exception("programEmail not specified in AppSettings.");
try
{
message = "";
}
catch (Exception ex)
{
}
return true;
}
我尝试在VS Express 2013 for Web中打开这个网站(我一直在使用2012 Pro),但我仍然得到相同的结果。
我也可以这样做第二个if
语句:
if (String.IsNullOrWhiteSpace(programEmail))
{
message = "";
throw new Exception("programEmail not specified in AppSettings.");
message = "something else";
}
调试器仅命中了引发异常的行(尽管我在调用此方法时添加了try/catch
,并且它没有捕获此异常)。
最后,在Visual Studio的选项中,我选择了“启用.NET Framework源步进”,String.IsNullOrWhiteSpace
评估为false,确认调试器已经告诉我的内容。