使抛出异常工作
本文关键字:工作 抛出异常 | 更新日期: 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,但我很惊讶你的代码通过第一行在你的你的代码中的RedirectToAction("Index") '不做任何事,因为你不返回的结果。谢谢Erik Norentry
。拥有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.
}
}