相关疑难解决方法(0)

Java或C#中的异常管理的最佳实践

我一直在决定如何在我的应用程序中处理异常.

如果我的异常问题来自1)通过远程服务访问数据或2)反序列化JSON对象.不幸的是,我不能保证这些任务中的任何一个都成功(切断网络连接,不正确的JSON对象,这是我无法控制的).

因此,如果我遇到异常,我只需在函数内捕获它并返回FALSE给调用者.我的逻辑是,所有调用者真正关心的是任务是否成功,而不是为什么它不成功.

这是典型方法的一些示例代码(在JAVA中)

public boolean doSomething(Object p_somthingToDoOn)
{
    boolean result = false;

    try{
        // if dirty object then clean
        doactualStuffOnObject(p_jsonObject);

        //assume success (no exception thrown)
        result = true;
    }
    catch(Exception Ex)
    {
        //don't care about exceptions
        Ex.printStackTrace();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我认为这种方法很好,但我真的很想知道管理异常的最佳实践是什么(我应该在调用堆栈中一直冒出异常吗?).

总结关键问题:

  1. 是否可以捕获异常但不会冒泡或正式通知系统(通过日志或通知用户)?
  2. 对于不会导致所有需要try/catch块的异常的最佳实践有哪些?

跟进/编辑

感谢所有反馈,在网上找到了一些关于异常管理的优秀来源:

似乎异常管理是根据上下文而变化的事情之一.但最重要的是,人们应该如何管理系统中的异常.

另外注意通过过多的尝试/捕获代码腐烂或不给予例外它的尊重(例外是警告系统,还需要警告什么?).

此外,这是m3rLinEz的一个很好的选择评论.

我倾向于同意Anders Hejlsberg和你的看法,大多数来电者只关心操作是否成功.

从这个评论中,它提出了一些在处理异常时要考虑的问题:

  • 抛出此异常有什么意义?
  • 处理它有什么意义?
  • 呼叫者是否真的关心异常,还是只关心呼叫是否成功?
  • 是否强制调用者管理潜在的异常优雅?
  • 你是否尊重这种语言的含义?
    • 你真的需要返回像布尔这样的成功标志吗?返回boolean(或int)更像是一种C心态而不是Java(在Java中你只是处理异常).
    • 遵循与语言相关的错误管理结构:)!

c# java error-handling exception

117
推荐指数
5
解决办法
3万
查看次数

处理方法中的已知错误和错误消息

处理方法中发生的已知错误有哪些好方法?

我们以用户注册方法为例.当用户注册时,SignUp( User user )会调用一个方法.可能会发生一些已知错误.

  • 该邮箱地址已被注册
  • 用户名已被注册
  • 等等

你可以抛出特定的例外:

public void SignUp( User user )
{
    // Email already exists
    throw new EmailExistsException();
}
Run Code Online (Sandbox Code Playgroud)

现在可以捕获特定的例外情况.

这在我看来是不好的,因为异常被用于流量控制.

你可以返回一个布尔声明,如果它成功并传入一个错误消息,如果发生错误将被设置:

public bool SignUp( User user, out/ref string errorMessage )
{
    // Email already exists
    errorMessage = "Email already exists.";
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我出于某些原因不喜欢这个.

  • 必须返回一个值.如果方法需要返回值怎么办?
  • 每次都必须传递错误消息.
  • 该方法的消费者应该是确定消息是什么的消费者.

让我们说一下在方法中设置的实际消息是坏的.

您可以使用错误代码:

public enum Errors
{
    Successful = 0,
    EmailExists,
    UsernameExists,
    Etc
}

public Errors SignUp( User user )
{
    // Email already exists
    return …
Run Code Online (Sandbox Code Playgroud)

.net c#

6
推荐指数
1
解决办法
485
查看次数

标签 统计

c# ×2

.net ×1

error-handling ×1

exception ×1

java ×1