C# Catch块中IF语句的最佳实践
我有如下方法:C# Catch块中IF语句的最佳实践,c#,exception,design-patterns,C#,Exception,Design Patterns,我有如下方法: public static addSomething(int id) { string msg = getStringMsg(id); try { //do lots of stuff Console.WriteLine(msg) } catch (Exception e) { if (id == 1) throw new Exception("Exceptio
public static addSomething(int id)
{
string msg = getStringMsg(id);
try
{
//do lots of stuff
Console.WriteLine(msg)
}
catch (Exception e)
{
if (id == 1)
throw new Exception("Exception msg 1: " + msg);
else
throw new Exception("Exception msg 2: " + msg);
}
}
在catch块中有这样的条件分支是不受欢迎的吗?如果是,我的选择是什么
我想我能做到:
public static addSomething(int id)
{
string msg = getStringMsg(id);
string exceptionMsg;
if (id == 1)
exceptionMsg = "Exception msg 1: " + msg);
else
exceptionMsg = "Exception msg 2: " + msg);
try
{
//do lots of stuff
Console.WriteLine(msg)
}
catch (Exception e)
{
throw new Exception(exceptionMsg);
}
}
但我真的希望尽量减少try块之外的代码。这就是我的第二个问题:是否有一种方法可以将
getStringMsg(id)
分配给try
块中的msg
,但仍然可以在catch
块中访问它?我建议您避免创建错误消息,直到错误发生。另外,我建议将原始异常作为内部异常传递给要抛出的异常(如果您希望将其抛出到应用程序的更高级别,最好创建一些自定义异常):
我相信您的
try
块也有许多基于参数id
的条件逻辑。在这种情况下,最好将实现拆分为单独的方法,每个方法都有自己的try-catch
块
也考虑重构-
这很好,但是你应该把抛出的异常作为你抛出的内部异常:
catch (Exception ex)
{
...
throw new Exception("message", ex);
...
}
如果您想要重新抛出句柄异常,只需键入throw代码>。不要再扔了。关于这种差异以及为什么单词语句--throw
-最好的原因,有很多文章都在讨论。+1对于代码可读性的多态性链接,我个人将使用您的第一个示例。我的问题是,为什么你不只是把e.Message、msg和id格式化成你需要的格式,然后把它们泡起来呢。通常,catch块用于恢复应用程序,而不是用于业务逻辑。还有一个问题-您真的需要将getStringMsg(id)
返回的msg
添加到错误消息中吗?你需要在你的很多东西中做什么?msg
或id
,或者两者都需要?第一个问题的答案是肯定的。这是一个非常简化的版本,可以抓住问题的核心。是的,我需要msg
和id
中的//很多东西。在阅读了它们之后,我真的认为你应该创建一个类,而不是传递ID。根据ID,似乎有很多不同的功能,这些功能应该存储在一个集中的地方。@the_lotus:我完全同意你的观点,但不幸的是,设计决策不是由我决定的。
catch (Exception ex)
{
...
throw new Exception("message", ex);
...
}