我对在方法层次结构中处理异常感到有点困惑。
让我们说,我在班级图书馆项目中有一个班级Logger
。请查看以下代码 -
namespace MyLibrary
{
public class Logger
{
//exposed to other project
public static void CreateLog(String message)
{
try
{
WriteInFile(message); //calling the method below
}
catch (Exception Ex)
{
throw Ex;
}
}
//private method
private static void WriteInFile(String message)
{
try
{
//Writing in a file
}
catch (Exception Ex)
{
throw Ex;
}
}
}
}
让我们假设,我在ASP.NET MVC项目中使用该库。代码 -
namespace MvcProject.Controllers
{
public class HomeController : Controller
{
public ActionResult DoSomething()
{
try
{
Logger.CreateLog("some text.");
}
catch (Exception Ex)
{
//Exception is handled here.
}
return View();
}
}
}
层次结构:DoSomething() -> CreateLog() -> WriteInFile()
所有这三种方法都有try.. catch..
块。我的问题是 -
我在try.. catch
和CreateLog()
方法中确实需要WriteInFile()
吗?
如果我使用它 所有方法,是否会对性能产生影响?
这是一个解释问题的虚构示例。
如果您发布修改后的答案,对我来说会更有用 你建议的代码块。
谢谢。
答案 0 :(得分:5)
我真的需要尝试..抓住每种方法吗?
没有。事实上,它通过切断堆栈跟踪来损害您的诊断 - 您将无法看到原始的完整堆栈跟踪。你可以通过使用:
来解决这个问题throw;
而不是
throw Ex;
...但基本上try / catch块只是在这里添加了cruft。摆脱它们。
如果我在所有方法中使用它,它是否会对性能产生影响?
仅在抛出异常时 - 但是每次重新计算堆栈跟踪可能会使其变慢。我不担心性能 - 首先担心代码的可读性(以及对堆栈跟踪的影响)。
答案 1 :(得分:1)
在try,catch结构中包装代码时,性能受到很小影响。
如果某个方法无法按其设计的方式执行操作,则抛出异常。这是调用者代码的“信号”,关于出错的地方。
由捕获 抛出的异常由您决定。 为此,我们在“try”语句中包装我们想要运行的代码,该语句设置用于捕获异常的代码。
如果抛出异常,catch块就是代码跳转到的位置。 您可以执行catch语句的变体,例如“仅捕获特定类型的异常”,或捕获所有异常。
您无需在所有功能中尝试/捕获。 相反,我们通常会从库中抛出异常,让应用程序员设置try / catch结构。 通过这种方式,业务逻辑的程序员决定如何处理错误,而不是库的程序员。
你有时可能希望通过处理一些错误来帮助应用程序程序员,这可能是这样的东西: you library捕获文件系统忙的异常 在我们恐慌之前,我们捕获异常并重试几次,然后再将异常抛到流中......
这一切都取决于它是什么类型的例外。