我有以下方法:
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)
分配给msg
块内的try
,但仍然可以在catch
块中访问它?
答案 0 :(得分:4)
我建议您在发生错误之前避免错误消息的创建。另外我建议将原始异常作为内部异常传递给你抛出的异常(如果你想把它扔到应用程序的更高级别,最好创建一些自定义异常):
public static void addSomething(int id)
{
string msg = getStringMsg(id);
try
{
//do lots of stuff
Console.WriteLine(msg)
}
catch (Exception e)
{
string errorMessage = (id == 1) ?
"Exception msg 1: " : "Exception msg 2: ";
throw new FooException(errorMessage + msg, e);
}
}
答案 1 :(得分:2)
我相信,根据您的参数try
,您的conditional logic
广告块还有很多id
。在这种情况下,最好将实现拆分为单独的方法,每个方法都有自己的try catch
块。
答案 2 :(得分:0)
没关系,但你应该把抛出的异常作为你抛出的内部异常传递:
catch (Exception ex)
{
...
throw new Exception("message", ex);
...
}
如果您想重新抛出句柄异常,只需键入throw;
即可。不要再扔了。有很多关于差异的文章以及为什么单个单词陈述 - throw
- 是最好的。