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

本文关键字:返回 状态 记录 异常 日志 C#- | 更新日期: 2023-09-27 18:20:09

修改以使其清楚:

我有一个关于异常日志和优雅退出的问题。这是上一个问题的延续。代码看起来像:

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

方法内部1:

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

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

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

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

也可以重新考虑你的退货类型。看起来你可能在使用整数,认为你在使用字符串时会出现错误。

不要使用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;
        }            
    }
}

这段代码实现了相同的功能,但将函数的返回代码留给了一些有用的、非特殊的东西。

更一般地说,我建议您应该在应用程序的顶层有一个catch-all处理程序来处理日志记录,或者每个公共入口点最多有一个。其他处理程序应该处理他们实际上可以"处理"(做点什么)的特定异常类型。

这一切都取决于代码的目的和实现;有时,最好允许异常传递回调用者——它们应该在特殊情况下使用。

然而,如果您确实打算使用返回代码,我会更倾向于使用enum的(不过,这取决于代码的用途)。这样,调用者就可以很容易地对照返回代码的可用选择进行检查。此外,还有一条关于使用整数或字符串作为错误代码的注释——调用方可能无法很好地了解问题所在。在这种情况下,抛出Exception或特定类型(包含错误消息),或返回具有描述性名称的预定义enum,对调用者来说更有意义。

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

一般来说,最好将异常推送到处理得最好的地方。如果你正在编写一个与某些Web服务接口的框架,你的框架的用户很可能不会关心网络异常等——他们想要返回代码,或者更好的是,你包含/code的一些特定于框架的异常。

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

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