我对在方法层次结构中处理异常有点困惑。
比方说,我在一个类库项目中有一个类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..
块。我的问题是-
在
CreateLog()
和WriteInFile()
方法中,我真的需要try.. catch
吗?如果我在所有的方法,它对性能有影响吗?
这是一个用来解释问题的虚构例子。
如果你发布一个修改后的答案,对我来说会更有用您建议的代码块。
谢谢。
我真的需要试试吗。。每种方法都有漏洞?
没有。事实上,它通过切断堆栈跟踪来损害您的诊断-您将无法看到原始的完整堆栈跟踪。你可以通过使用来解决这个问题
throw;
而不是
throw Ex;
但基本上try/catch块是,只是在这里添加cruft。把他们赶走。
如果我在所有方法中都使用它,它会对性能产生影响吗?
只有在抛出异常的情况下,但每次重新计算堆栈跟踪可能会使速度变慢。不过,我不会担心性能——首先要担心代码的可读性(以及对堆栈跟踪的影响)。
在try-catch结构中包装代码时,会对性能造成很小的影响。
当一个方法未能完成其设计任务时,它应该抛出异常。这是对调用者代码的"一个信号",表示哪里出了问题。
由您捕获抛出的异常。为此,我们将要运行的代码封装在一个"try"语句中,该语句为捕获异常设置代码。
如果抛出异常,catch块是代码跳转到的位置。您可以执行catch语句的变体,如"只捕获特定类型的异常"或捕获所有异常。
您不需要在所有函数内部进行try/catch。相反,我们通常从库中抛出异常,并让应用程序程序员设置try/catch结构。这样,决定如何处理错误的是业务逻辑的程序员,而不是库的程序员。。
有时,您可能希望通过处理一些错误来帮助应用程序程序员,这些错误可能包括:您的库捕获到文件系统繁忙的异常在我们恐慌之前,我们捕获异常并重试几次,然后将异常进一步抛出。。。
这完全取决于它是什么类型的异常。