2012-01-12 75 views
-1

修改以清除:C# - 异常日志记录和返回状态

我有一个关于异常日志记录和优雅退出的问题。这是继续前question。代码如下:

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

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

的方法一内部:

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

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

+0

“最佳实践”:用于什么目的? – Richard 2012-01-12 09:29:43

+0

我是否需要将异常返回给调用方法或者只有状态就足够了。在-1状态下,我知道被调用方法中的异常以及日志文件中记录的异常的细节。 – Siva 2012-01-12 09:31:58

+1

你有没有考虑过代码评论:http://codereview.stackexchange.com/? – mbanzon 2012-01-12 09:33:52

回答

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; 
     }    
    } 
} 

此代码实现相同的功能,但留下的函数的返回码有用的东西和不例外。

更一般地说,我建议你应该在应用程序的最高级别处理日志,或者每个公共入口点至多有一个捕获所有处理程序。其他处理程序应该处理特定的异常类型,它们实际上可以“处理”(执行某些操作)。

2

我认为可以这样做,如果你有很多的状态代码,否则你也可以只是抛出一个异常,并在上面的方法中捕获它。

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

1

这一切都取决于代码的目的和实施;有时最好允许异常传回给调用者 - 它们应该在exceptional cases中使用。但是,如果你打算使用返回码,我会更倾向于使用enum(尽管这又取决于代码的用途)。这样,调用者很容易检查可用的返回代码选择。此外,对使用整数或字符串作为错误代码的评论 - 对于调用者来说,可能不是很明确地知道问题是什么。在这种情况下,抛出一个Exception或一个特定的类型(包含错误信息),或者返回一个预定义的enum和一个描述性的名字,对于调用者来说更有意义。

1

从这些简短的代码片段什么都不做,很难说什么是最佳实践。

一般来说,最好将异常推送到最好的位置。如果你正在编写一个框架来与一些web服务进行接口,那么你的框架的用户很可能不会关心网络异常等等 - 他们想要返回代码,或者甚至更好地包含一些你包含/代码的特定于框架的异常。

1

HM - 在你的情况,我宁愿做以下,但它确实取决于实际情况:

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两次。我想这是因为它是一个快速样本...

+0

感谢您的回答。这是为了调用服务。它的工具,但我会学会使它更清洁和更好的代码。 – Siva 2012-01-12 09:36:37

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 
      } 
    }