gpt4 book ai didi

C# 捕获特定异常类型的重新抛出/传播

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:03 29 4
gpt4 key购买 nike

如您所见,我正在尝试将 GatewayConnectionFailedException 传播到我的 UI。我希望此代码捕获除异常之外的所有内容,我希望表示层捕获该异常以通知用户数据库是问题所在,以便他可以去修复它。我的问题是,当我第一次抛出它时,我得到 GatewayConnectionFailedException not handled by user code on GatewayException catch 子句。

同样重要的是要注意 GatewayConnectionFailedException extends GatewayException,它扩展了 Exception。有没有我遗漏的东西,或者我必须将所有捕获物移到表示层?

        try
{
something();
}
catch (GatewayConnectionFailedException gcfe)
{
throw;
}
catch (GatewayException ge)
{
if (ge.GetType() == typeof(GatewayConnectionFailedException))
throw;
string errMsg = "Records could not be retrieved due to a data gateway error. " + GetTypeInfo();
_logger.Error(errMsg + "\r\n{0}", ge);
}
catch (Exception e)
{
if (e.GetType() == typeof(GatewayConnectionFailedException))
throw;
string errMsg = "Records could not be retrieved due to an unexpected error. " + GetTypeInfo();
_logger.Error(errMsg + "\r\n{0}", e);
}

最佳答案

愚蠢的问题...您的 UI 代码是否在调用该层时尝试捕捉?有些东西必须处理第二次抛出...

简而言之,听起来您正在尝试这样做:

using System;

namespace ConsoleApplication1
{
class ExceptionA : Exception
{
public override string Message
{
get
{
return "Exception A";
}
}
}

class ExceptionB : ExceptionA
{
public override string Message
{
get
{
return "Exception B";
}
}
}

class Program
{
static void Main(string[] args)
{
try
{
DoThing();
}
catch (Exception ex)
{
Console.WriteLine("Caught in 'UI' code: " + ex.Message);
}
}

static void DoThing()
{
try
{
throw new ExceptionB();
}
catch (ExceptionB ex)
{
Console.WriteLine("Caught B");
throw;
}
catch (ExceptionA ex)
{
Console.WriteLine("Caught A");
}
catch (Exception ex)
{
Console.WriteLine("Caught Generic");
}
}
}
}

产生这个输出:

抓到B
陷入“用户界面”代码:异常(exception)B
按任意键继续...

似乎您没有捕获到第二个抛出的异常,这就是它“未处理”的原因。如果我们注释掉 main 中的 try-catch,我们将得到一个未处理的异常:

static void Main(string[] args)
{
//try
//{
DoThing();
//}
//catch (Exception ex)
//{
//Console.WriteLine("Caught in 'UI' code: " + ex.Message);
//}
}

产生以下输出:

抓到 B

未处理的异常:ConsoleApplication1.ExceptionB:异常 B 在 C:\Users\Giovanni\AppData\Local\T 中的 ConsoleApplication1.Program.DoThing()临时项目\ConsoleApplication1\Program.cs:第 50 行 在 C:\Users\Giovanni\AppDa 中的 ConsoleApplication1.Program.Main(String[] args)ta\Local\Temporary Projects\ConsoleApplication1\Program.cs: 第 33 行按任意键继续 。 . .

关于C# 捕获特定异常类型的重新抛出/传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8852922/

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