使抛出异常工作

本文关键字:工作 抛出异常 | 更新日期: 2023-09-27 17:50:35

我一直在尝试用这些指令写一个小程序:

在这个作业中,你应该写一个简单的web应用程序,在web的首页上有一个链接。如果链接被点击,用户将被简单地再次路由到首页(使用RedirectToAction)。然而,偶尔,操作方法可能会抛出异常(但并非总是如此)。偶尔(每5次中有1次)该方法应该抛出一个ArgumentException,偶尔(再次,可能在5次中有1次),它应该抛出一个您应该自己声明的自定义异常对象,称为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 class:

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崩溃了,我得到错误,不要认为这是例外,我对它很陌生,所以也许它是应该出现的框:)但是电子邮件从来没有到达我的帐户。

我还缺少什么使一切工作?我知道file-thing不在这段代码中,我想先让其他东西工作。

我已经在web.config中添加了我的eMail信息

使抛出异常工作

你真的需要重新设计你的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.
    }
}