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

时间:2015-03-24 10:23:25

标签: c# exception-handling

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

让我们说,我在班级图书馆项目中有一个班级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.. catchCreateLog()方法中确实需要WriteInFile()吗?

  • 如果我使用它 所有方法,是否会对性能产生影响?

这是一个解释问题的虚构示例。

  

如果您发布修改后的答案,对我来说会更有用   你建议的代码块。

谢谢。

2 个答案:

答案 0 :(得分:5)

  

我真的需要尝试..抓住每种方法吗?

没有。事实上,它通过切断堆栈跟踪来损害您的诊断 - 您将无法看到原始的完整堆栈跟踪。你可以通过使用:

来解决这个问题
throw;

而不是

throw Ex;

...但基本上try / catch块只是在这里添加了cruft。摆脱它们。

  

如果我在所有方法中使用它,它是否会对性能产生影响?

仅在抛出异常时 - 但是每次重新计算堆栈跟踪可能会使其变慢。我不担心性能 - 首先担心代码的可读性(以及对堆栈跟踪的影响)。

答案 1 :(得分:1)

在try,catch结构中包装代码时,性能受到很小影响。

如果某个方法无法按其设计的方式执行操作,则抛出异常。这是调用者代码的“信号”,关于出错的地方。

捕获 抛出的异常由您决定。 为此,我们在“try”语句中包装我们想要运行的代码,该语句设置用于捕获异常的代码。

如果抛出异常,catch块就是代码跳转到的位置。 您可以执行catch语句的变体,例如“仅捕获特定类型的异常”,或捕获所有异常。

您无需在所有功能中尝试/捕获。 相反,我们通常会从库中抛出异常,让应用程序员设置try / catch结构。 通过这种方式,业务逻辑的程序员决定如何处理错误,而不是库的程序员。

你有时可能希望通过处理一些错误来帮助应用程序程序员,这可能是这样的东西: you library捕获文件系统忙的异常 在我们恐慌之前,我们捕获异常并重试几次,然后再将异常抛到流中......

这一切都取决于它是什么类型的例外。