C# - 异常记录和返回状态

时间:2012-01-12 09:27:20

标签: c# exception

修改以明确:

我有关于异常记录和优雅退出的问题。这与之前的question相继。代码如下:

string status = "0";
ClassA ObjA = new ClassA();

try
{
    status = objA.Method1();
    if (status != "-1")
    {                        
        status = objA.Method1();
    }
 }
 catch (Exception Ex)
 {
     //Log Exception EX
 }

在Method1中:

public string Method1()
{
    string status = "0";
    try
    {
        //Code
        return "0";
    }
    catch (Exception Ex)
    {
        //Log Exception with details
        return "-1"
    }
}

我在调用方法中记录Exception并仅向调用者返回状态。 我应该将Exception返回给调用方法还是只有足够的状态。状态为“-1”时,我知道被调用方法中有Exception,并且Exception的详细信息记录在日志文件中。

6 个答案:

答案 0 :(得分:2)

我认为如果您拥有大量状态代码就可以这样做,否则您也可以抛出异常并在更高的方法中捕获它。

也许可以重新考虑你的回报类型。看起来你可能正在使用整数,认为你正在使用字符串打开自己的错误。

答案 1 :(得分:1)

这一切都取决于代码的目的和实现;有时最好允许异常传递给调用者 - 它们应该在exceptional cases中使用。

但是,如果你打算使用返回代码,我会更倾向于使用enum(尽管如此,它取决于代码的用途是什么)。这样,调用者很容易检查可用的返回代码选择。此外,使用整数或字符串作为错误代码的注释 - 对于调用者来说,知道问题是什么可能不是很具描述性。在这种情况下,抛出Exception或特定类型(包含错误消息),或返回带有描述性名称的预定义enum对调用者来说更有意义。

答案 2 :(得分:1)

从这些没有任何作用的简短代码片段中,很难说什么是最佳实践。

通常,最好将异常推送到最佳处理位置。如果您正在编写一个与某些Web服务接口的框架,那么您的框架用户很可能不关心网络异常等 - 他们需要返回代码,或者更好的是您包含/代码的一些特定于框架的异常。

答案 3 :(得分:1)

嗯 - 在你的情况下,我宁愿做以下事情,但这实际上取决于具体情况:

public string Method1()
{
    string status = "0";

    //Code - Exception may be thrown
    return "0";
}

string status = "0";
ClassA ObjA = new ClassA();
try
{
     status = objA.Method1();
 }
 Catch(Exception Ex)
 {
     //Log Exception EX
    status = "-1;
 }

修改
有时很难定义指示方法中是否发生错误的值。您应该记住Nullable类型。如果您可以找到指示错误的合适返回值,也可以在导致错误的方法中记录错误,并按照您的建议对返回值做出反应。

顺便说一句:在你的代码中,如果第一次调用成功,你将调用Method1两次。我想这是因为它是一个快速的样本...

答案 4 :(得分:1)

class MyException : Exception
{
   public readonly int status;
   public  MyException(int status, string msg):base(msg)
   {
      this.status = status;
   }
}

public string Method1()
{   
   throw new MyException(-1,"msg");
    return "0";
}




SomeCode()
    {

         try
         {
                  Method1();
         }catch(MyException ex)
         { 
            ex.status //here you get the status
          }
     }

答案 5 :(得分:1)

不要使用status返回值,它不会添加对您有用的任何内容。

考虑,

var a = new ClassA()
try
{
    a.Mehtod1();
}
catch
{
    try
    {
        a.Method1();
    }
    catch (Exception ex)
    {
        //Log without details;
    }
}

class ClassA
{
    void Method1()
    {
        try
        {
             //Code
        }
        catch (Exception ex)
        {
            //Log with details
            throw;
        }            
    }
}

此代码实现了相同的功能,但保留了函数的返回代码,以实现有用和非特殊的功能。

更一般地说,我建议您应该在应用程序的顶级处理一个处理日志记录的处理程序,或者每个公共入口点最多一个处理程序。其他处理程序应该处理它们实际上可以“处理”的特定异常类型(做一些事情。)