"抛出新的......"未处理的例外情况,最佳做法是什么?它已经处理完毕了

Ind*_*ent 2 c# multithreading exception-handling try-catch

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

这项工作应该由一个新类来完成,该类继承Exception对象并使用新的"退出"扩展功能,该退出包括对用户的错误信号和日志记录例程.

我可能需要了解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;
}
Run Code Online (Sandbox Code Playgroud)

我想你可以看到我在这里想做什么.

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

不幸的是,应用程序将throw作为未处理并关闭我的Thread并且应用程序在重新启动之前将无法运行.除了这种情况,我也使用这个抛出catch语句.

在我看来,这是非常有效的.

这里有什么最佳做法?
我希望异常处理能够在不同场景(如上所述)上"回退",因此我总是有一种简单的方法将错误传达给用户(这意味着我可以发送有关异常位置的非常准确的信息) ).

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

Exception逻辑中的一部分代码,

public class UnexpectedQueryException: CommunicationException
{
    public UnexpectedQueryException(SomeObject object, ErrorCode errorCode) : base("UnexpectedQueryException", object, errorCode)
    {
     .........
    }
}
Run Code Online (Sandbox Code Playgroud)

反过来,它继承了基本的Exception对象,

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

    public CommunicationException(string Message, SomeObject object, ErrorCode errorcode)
    {
     .....
    }
    public CommunicationException() : base("CommunicationException")
    { }
}
Run Code Online (Sandbox Code Playgroud)

Ode*_*ded 6

如果你在代码中抛出一个异常,你需要抓住它并用它做一些事情 - 如果你没有,你还没有处理它.

如果你扔进一个catch街区,同样的事情适用.你抛出了一个异常,它将继续传播直到找到合适的catch块.如果不存在,则未处理.

您需要构建更高级别的(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. 
}
Run Code Online (Sandbox Code Playgroud)