我一直在尝试用这些说明编写一个小程序:
在此作业中,您应该编写一个简单的Web应用程序,在Web的首页上有一个链接。如果单击该链接,则会再次将用户路由到首页(使用
RedirectToAction
)。但是,偶尔,action方法可能会抛出异常(但并非总是如此)。偶尔(每5次一次)该方法应该抛出一个ArgumentException
,偶尔(再次,在5中可能是1),它应该抛出一个你应该自己声明的自定义Exception对象,称为MyApplicationException。
在 HomeController 中,我有:
public class HomeController : Controller
{
List<Logger> m_loggers = new List<Logger>();
protected override void OnException(ExceptionContext fc)
{
base.OnException(fc);
Exception ex = fc.Exception;
Logger.Instance.Log(ex);
}
public ActionResult Index()
{
string strLogFile = System.Configuration.ConfigurationManager.AppSettings["LogFile"];
string strEmail = System.Configuration.ConfigurationManager.AppSettings["Email"];
try
{
RedirectToAction("Index");
using(MailMessage message = new MailMessage())
{
message.To.Add(strEmail);
message.Subject = "Villuskilaboð";
message.Body = "Upp hefur komið villa frá Skilaverkefni 4!";
using(SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.Send(message);
}
}
}
catch(Exception ex)
{
Random r = new Random();
int rand = r.Next(1000);
if(rand % 5 == 0)
{
throw new System.ArgumentException("Randon villuskilaboð handa þér!");
}
Debug.WriteLine(ex.Message +
Environment.NewLine +
ex.StackTrace);
}
return View();
}
Logger
上课:
public class Logger
{
List<LogMedia>m_loggers = new List<LogMedia>();
private static Logger theInstance = null;
public static Logger Instance
{
get
{
if (theInstance == null)
{
theInstance = new Logger();
}
return theInstance;
}
}
private Logger()
{
m_loggers = new List<LogMedia>();
//m_loggers.Add(new TextFileLogMedia { });
//m_loggers.Add(new EmailLogMedia { });
}
public void Log(Exception ex)
{
foreach(LogMedia log in m_loggers)
{
log.LogMessage(ex.Message + Environment.NewLine);
}
}
}
LogMedia
public class LogMedia
{
public virtual void LogMessage(string Message)
{
}
public class OutputWindowLogMedia: LogMedia
{
public override void LogMessage(string Message)
{
System.Diagnostics.Debug.WriteLine(Message);
}
}
public class TextFileLogMedia: LogMedia
{
public override void LogMessage(string Message)
{
//File.AppendAllText("c:\\Temp.Log.txt", Message);
}
}
public class EmailLogMedia: LogMedia
{
public override void LogMessage(string Message)
{
}
}
}
我现在卡住了,似乎没有让它工作,我的Visual Studio崩溃,我得到了错误,不要认为这是例外,我是新的,所以也许它是盒子应该会出现:)但电子邮件永远不会进入我的帐户。
为了让一切顺利,我仍然缺少什么?我知道文件不在这个代码中,试图让其他东西先工作。
我在web.config
添加了有关我的电子邮件的信息。
答案 0 :(得分:1)
您确实需要重新设计Index()
方法。 我不是在使用Visual Studio的电脑前,但我很惊讶您的代码超出了你有的RedirectToAction(“Index”)`你的代码什么都不做,因为你没有返回结果。 谢谢Erik Noren try
的第一行。让RedirectToAction("Index")
发出警告,表示永远不会到达方法的其余部分,并在尝试访问该方法时创建一个无限循环。
这将是我构建方法的方式:
public ActionResult Index() {
// No need to go higher, as it's always just as random with a modulo
int rnd = (new Random()).Next(5);
try {
switch (rnd) {
case 1: // Or any of the 5 numbers you want.
throw new ArgumentException();
case 4: // Again, any of the 5 numbers
throw new MyApplicationException();
default:
return RedirectToAction("Index");
}
}
catch (Exception ex) {
// Do your error logging here.
}
}