类库和其他项目之间的异常处理技术



我对在方法层次结构中处理异常有点困惑。

比方说,我在一个类库项目中有一个类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结构。这样,决定如何处理错误的是业务逻辑的程序员,而不是库的程序员。。

有时,您可能希望通过处理一些错误来帮助应用程序程序员,这些错误可能包括:您的库捕获到文件系统繁忙的异常在我们恐慌之前,我们捕获异常并重试几次,然后将异常进一步抛出。。。

这完全取决于它是什么类型的异常。

最新更新