我知道这可能有点奇怪,但怀疑是一个怀疑... 在以下情况下会发生什么......
private void SendMail()
{
try
{
//i try to send a mail and it throws an exception
}
catch(Exception ex)
{
//so i will handle that exception over here
//and since an exception occurred while sending a mail
//i will log an event with the eventlog
//All i want to know is what if an exception occurs here
//while writing the error log, how should i handle it??
}
}
谢谢。
答案 0 :(得分:4)
我会亲自用另一个try \ catch语句将调用写入事件日志。
但是,最终取决于您的规格。如果系统将故障写入事件日志至关重要,那么您应该允许它被抛出。但是,根据您的示例,我怀疑这是您想要做的。
答案 1 :(得分:4)
您可以在错误记录方法中捕获错误。但是我不会亲自这样做,因为破坏错误日志记录是您的应用程序根本无法运行的标志。
private void SendMail()
{
try
{
//i try to send a mail and it throws an exception
}
catch(Exception ex)
{
WriteToLog();
}
}
private void WriteToLog()
{
try
{
// Write to the Log
}
catch(Exception ex)
{
// Error Will Robinson
// You should probably make this error catching specialized instead of pokeman error handling
}
}
答案 2 :(得分:1)
只有在try-catch块内部才会捕获每个异常。你可以嵌套try-catch,但通常不是一个好主意。
答案 3 :(得分:0)
您也可以在try-catch
块中添加catch
块。
答案 4 :(得分:0)
考虑到写入文件时的异常类型(权限,磁盘空间......),我建议不要在这里处理它。如果它第一次失败,很有可能你无法写入事件日志,因为它无法在事件日志中写入...
让它冒泡并由上层try / catch处理。
答案 5 :(得分:0)
Chris S.有最好的答案。在catch块中放置一个try-catch块很少是一个好主意。在你的情况下,它只会卷入你的代码。如果您在此处检查是否成功写入了日志文件,则必须在尝试写入日志文件的每个位置执行此操作。在通知/处理这些模块中的错误条件时,可以通过使所有单个模块自包含来轻松避免这种不必要的代码重复。发送邮件失败时,您可以在catch块中执行适当的操作来处理这种异常情况,例如:
在catch块中,只需调用您定义的任何API,将日志条目写入日志文件,然后忘记其余的。在您的日志记录API中,您应该处理任何与日志记录相关的异常情况(磁盘已满,没有写入文件的权限,找不到文件等等)。您的邮件模块无需知道日志记录是否成功,应将该职责委托给日志记录模块。
答案 6 :(得分:0)
我个人使用简单的扩展方法处理这种情况。
public static class MyExtentions
{
public static void LogToErrorFile(this Exception exception)
{
try
{
System.IO.File.AppendAllText(System.IO.Path.Combine(Application.StartupPath, "error_log.txt"),
String.Format("{0}\tProgram Error: {1}\n", DateTime.Now, exception.ToString()));
}
catch
{
// Handle however you wish
}
}
}
用法很简单:
try
{
...
}
catch(Exception ex)
{
ex.LogToErrorFile();
}
然后,您可以根据需要在扩展方法中处理捕获的异常,或者只是不捕获它并让它冒泡到顶部。我发现这个设计是一种简单,可重复的方法来处理整个应用程序中的异常。
答案 7 :(得分:0)
首先我要说的是不要在catch块中捕获“Exception”。相反,您可以检查所有有效性,然后捕获您可以执行某些操作的特定异常(SmtpException)(并通过友好消息通知用户)。从您的代码中抛出异常并通知UI并不是一个坏主意。如果您的方法接受具有特定规范的输入,并且如果它们不符合,则您的方法应该/可以抛出错误并通知用户它。
对于无法控制的异常,请使用全局处理异常,例如Web的Application_Error。 Getting Better Information on Unhandled Exceptions Peter Bromberg更好地解释了这一点。
此外,对于您正在访问的任何私有资源(如事件日志),请确保程序集可以访问它。
有用的链接Build a Really Useful ASP.NET Exception Engine By Peter A. Bromberg 和 Documenting Exceptional Developers By Peter A. Bromberg 对于Web应用程序,请查看 Health monitoring Exception logging
还有一件事,如果您的应用程序出错/抛出无法处理的错误(根本没有),最好让它优雅地继续下去而不是继续。在不稳定状态下应用并不是一个好主意。