抛出异常是有效的

时间:2014-03-16 20:35:02

标签: c# asp.net-mvc visual-studio

我一直在尝试用这些说明编写一个小程序:

  

在此作业中,您应该编写一个简单的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添加了有关我的电子邮件的信息。

1 个答案:

答案 0 :(得分:1)

您确实需要重新设计Index()方法。 我不是在使用Visual Studio的电脑前,但我很惊讶您的代码超出了try的第一行。让RedirectToAction("Index")发出警告,表示永远不会到达方法的其余部分,并在尝试访问该方法时创建一个无限循环。你有的RedirectToAction(“Index”)`你的代码什么都不做,因为你没有返回结果。 谢谢Erik Noren

这将是我构建方法的方式:

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.
    }
}