gpt4 book ai didi

c# - "throw new.."未处理的异常,最佳做法是什么?已经处理了

转载 作者:行者123 更新时间:2023-11-30 20:08:11 27 4
gpt4 key购买 nike

我尝试放置一个异常逻辑,系统的一部分可以回退到意外行为。

这项工作应该由一个继承Exception 对象的新类完成,并使用一个新的“exit”扩展功能,该“exit”由一个给用户的错误信号和一个日志例程组成。

我可能需要更好地理解 throw 的用法,但我可以通过以下方式使其相当透明:

public SomeObject GetVersion(byte p)
{
switch ((SomeObject)p)
{
case Version.SomeType1:
...
break;
case Version.SomeType2:
...
break;
default:
throw new UnexpectedQueryException(this.someOtherObject, errorCode);
}
return (SomeObject)p;
}

我想您可以在这里看到我要做什么。

当应用程序无法满足请求时,我会尝试抛出异常。抛出是为了让执行通过异常(它会为调用者生成足够的错误代码)。这个例子是一个错误类型“我知道你给了我 9 但这里只允许 1-8)”,errorCode 进一步发送到 UnexpectedQueryException(...)

不幸的是,应用程序将抛出视为未处理并关闭我的线程,应用程序将在重新启动之前无法运行。除了这个场景,我还在 catch 语句中使用了这个 throw。

在我看来,这是非常有把握的。

这里有什么最佳实践?
我希望异常处理成为在不同情况下激活的“回退”(如上),所以我总是有一种简单的方法将错误反馈给用户(这意味着我可以发送关于异常位置的非常准确的信息).

此外,我当然希望应用程序继续工作。

异常逻辑部分代码,

public class UnexpectedQueryException: CommunicationException
{
public UnexpectedQueryException(SomeObject object, ErrorCode errorCode) : base("UnexpectedQueryException", object, errorCode)
{
.........
}
}

它又继承了基本的 Exception 对象,

public class CommunicationException : Exception
{
..some fields..

public CommunicationException(string Message, SomeObject object, ErrorCode errorcode)
{
.....
}
public CommunicationException() : base("CommunicationException")
{ }
}

最佳答案

如果您在代码中抛出异常,您需要捕获它并做一些 - 如果您不这样做,则您没有处理它。

如果您在 catch block 中抛出异常,同样适用。您抛出了一个异常,该异常将继续传播,直到找到合适的 catch block 。如果不存在,则不处理。

您需要构建更高级别 (UI) 代码,以便它捕获正确类型的异常并将您想要的信息传达给用户:

try
{
// code that can throw
}
catch(VerySpecificException ex)
{
// communicate to user details about VerySpecificException.
// possibly log.
// Do not re-throw or throw a new excpetion as it is now handled.
}
catch(AnotherSpecificException ex)
{
// communicate to user details about AnotherSpecificException.
}
catch(LessSpecificException ex)
{
// communicate to user details about LessSpecificException.
}
catch(EveLessSpecificException ex)
{
// communicate to user details about EvenLessSpecificException.
}

关于c# - "throw new.."未处理的异常,最佳做法是什么?已经处理了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com