社区首页 >问答首页 >Polly没有正确处理OracleExceptions ORA-03113和ORA-03114

Polly没有正确处理OracleExceptions ORA-03113和ORA-03114
EN

Stack Overflow用户
提问于 2021-04-29 23:39:57
回答 1查看 204关注 0票数 2

我先前关于Polly和Oracle Connectivity的问题如下

async await throwing error for Polly code while connecting to Oracle DB

通过扩展这一点,我尝试处理基于连接和FTP连接的多个Oracle异常。它能够正确地处理FTP异常。但是对于甲骨文来说,它不能处理0RA-03113和ORA-03114。

这是我实现的代码。

代码语言:javascript
代码运行次数:0
复制
static void Main()
    {
        var retryTimes = 100;
        var retryableOracleErrorCodes = new[] { "ORA-03113", "ORA-03114", "ORA-12543", "ORA-12170", "ORA-12154"  };

        RetryPolicy retryPolicyFTP = Policy
            .Handle<Xceed.Ftp.FtpInvalidStateException>()
            .WaitAndRetry(retryTimes, _ => TimeSpan.FromSeconds(10));

        RetryPolicy retryPolicyFTP1 = Policy
            .Handle<Xceed.Ftp.FtpIOException>()
            .WaitAndRetry(retryTimes, _ => TimeSpan.FromSeconds(10));

        RetryPolicy retryPolicyOracle = Policy
            .Handle<OracleException>(ex => retryableOracleErrorCodes.Any(errorCode => ex.Message.Contains(errorCode)))
            .RetryForever();

        retryPolicyFTP.Execute(() =>
        {
            retryPolicyFTP1.Execute(() =>
            {
                retryPolicyOracle.Execute(() =>
                {
                    ApplicationMain applicationMain = new ApplicationMain();
                    applicationMain.Start();
                });
            });
        });
    }

请你把这件事弄清楚..。为什么它不能处理特定的Oracle异常。我的意思是,如果我破坏了Program之间的连接,它应该保持沉默而不会抛出该异常,而且当连接可用时,它应该能够检索数据库记录。

为什么它没有沉默,为什么它是breaking...for ORA-03113和ORA-03114.引发的错误如下所示。

详细的例外情况如下。

代码语言:javascript
代码运行次数:0
复制
36722763    Source.FtpInternal1.Poll    Failed  2021-04-30 08:40:00 2021-04- 
30 08:40:04     Oracle.DataAccess.Client.OracleException ORA-03113: end-of- 
file on communication channel
Process ID: 149519
Session ID: 1655 Serial number: 65101    at 
Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, 
OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object 
src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, 
OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* 
pOpoSqlValCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, 
Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader()
at Data.MetaRecord.Fill(DataTable dataTable, RecordCommand recordCommand, 
Object[] parameterValues, FillResultType fillResultType) in 
C:\Data\MetaRecord.cs:line 1348
at Data.MetaRecord.FillWithComposites(RecordCommandCompositeCollection 
recordCommandComposites, RecordCommandComposite parentRecordCommandComposite, 
Object[] parameterValues, FillResultType fillResultType) in 
C:\Data\MetaRecord.cs:line 1537
at Data.MetaRecord.FillWithComposites(RecordCommandCompositeCollection 
recordCommandComposites, RecordCommandComposite parentRecordCommandComposite, 
Object[] parameterValues, FillResultType fillResultType) in 
C:\Data\MetaRecord.cs:line 1551
at Data.MetaRecord.FillWithComposites(RecordCommandCompositeCollection 
recordCommandComposites, RecordCommandComposite parentRecordCommandComposite, 
Object[] parameterValues, FillResultType fillResultType) in 
C:\Data\MetaRecord.cs:line 1551
at Data.MetaRecord.RetrieveByPrimaryKey(RecordRetrieveAttributes 
recordRetrieveAttributes, Object[] primaryKeyValues) in 
C:\Data\MetaRecord.cs:line 1830
at Data.MetaRecord.GetRecordByPrimaryKey(RecordGetAttributes 
recordGetAttributes, Object[] primaryKeyValues) in C:\Data\MetaRecord.cs:line 
873
at Data.MetaRecord.GetRecordByPrimaryKey(Object[] primaryKeyValues) in 
C:\Data\MetaRecord.cs:line 923
at Processors.ExecuteInfo.GetAndRegisterRecord(RecordType recordType, 
Object[] primaryKeyValues) in C:\Core\Processors\ExecuteInfo.cs:line 143
at Processors.InternalPoll.ProcessExecute(DataTransaction dataTransaction, 
ExecuteInfo executeInfo, ProcessInfo processInfo) in 
C:\Core\Processors\InternalPoll.cs:line 67
at Processors.Processor.Execute(ExecuteInfo executeInfo, ProcessInfo 
processInfo) in C:\Core\Processors\Processor.cs:line 184

这是我准备的最后代码,但它仍然没有抛出OracleException消息。

代码语言:javascript
代码运行次数:0
复制
var retryTimes = 100;
var retryableOracleErrorCodes = new[] { "ORA-03113", "ORA-03114", "ORA-12543", "ORA-12170", "ORA-12154" };

RetryPolicy retryPolicyFTP = Policy
    .Handle<Xceed.Ftp.FtpInvalidStateException>().Or<Xceed.Ftp.FtpIOException>()
    .WaitAndRetry(retryTimes, _ => TimeSpan.FromSeconds(10));

RetryPolicy retryPolicyOracle = Policy
    .Handle<OracleException>(ex => retryableOracleErrorCodes
                                    .Any(errorCode => ex.ToString().Contains(errorCode)))
    .RetryForever();

Policy.Wrap(retryPolicyFTP, retryPolicyOracle).Execute(() =>
{
    try
    {
         ApplicationMain applicationMain = new ApplicationMain();
         applicationMain.Start();
    }
    catch (OracleException oraEx)
    {
         MessageBox.Show(oraEx.Message.ToString());
    }
});

.Or<Exception>()添加到最终代码后获得以下消息

代码语言:javascript
代码运行次数:0
复制
Oracle.DataAccess.Client.OracleException ORA-03114: not connected to ORACLE    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
   at Data.OraclePackageCommand.ExecuteNonQuery(OracleTransaction transaction) in C:\Core\Data\OraclePackageCommand.cs:line 74
   at Data.OraclePackageCommand.ExecuteNonQuery() in C:\Core\Data\OraclePackageCommand.cs:line 63
   at Data.OraclePackage.ExecuteServerHeartbeat(Int32 serverId, Int32 heartbeatInterval, DateTime processTime, Int32& processingStatusId, DateTime& lastHeartbeatTime, DateTime& nextHeartbeatTime, Int32& availableProcessCount, Boolean& recordModificationExists) in C:\Core\Data\OraclePackage.cs:line 2385
   at Processors.ServerInfo.Heartbeat(DateTime processTime, ServerProcessingStatus& heartbeatProcessingStatus, Int32& availableProcessCount, Boolean& recordModificationExists) in C:\Core\Processors\ServerInfo.cs:line 252
   at Processors.ServerManager.ThreadStart() in C:\Core\Processors\ServerManager.cs:line 337
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-02 23:28:04

TL:我认为你的问题的根本原因是被吞没的异常。

代码语言:javascript
代码运行次数:0
复制
try
{
     ApplicationMain applicationMain = new ApplicationMain();
     applicationMain.Start();
}
catch (OracleException oraEx)
{
     MessageBox.Show(oraEx.Message.ToString());
}

当抛出一个OracleException时,它将显示在UI上。

但是,该方法将结束,不会触发任何策略。

为了能够重现您的问题,我更改了以下内容:

我已经将第三方的例外替换为内置的

  • FtpInvalidStateException >> NotSupportedException
  • OracleException >> ArgumentException

我为每个triggered

  • I've定义了两个委托来输出异常消息,当策略是FaultyMethod

  • Lastly时,将最大重试和等待时间更改为更小的

  • ,我已经将要修饰的代码提取成一个单独的函数,名为FaultyMethod

  • Lastly--让FaultyMethod变得非常错误:)

主要与策略声明和使用

代码语言:javascript
代码运行次数:0
复制
static readonly string[] retryableErrorCodes = 
    new[] { "ORA-03113", "ORA-03114", "ORA-12543", "ORA-12170", "ORA-12154" };
const int retryTimes = 3;

static void Main()
{
    RetryPolicy retryForNotSupported = Policy
        .Handle<NotSupportedException>()
        .WaitAndRetry(
            retryTimes,
            _ => TimeSpan.FromSeconds(1),
            (ex, ts) => Console.WriteLine(ex.Message));

    RetryPolicy retryForArgument = Policy
        .Handle<ArgumentException>(ex =>
            retryableErrorCodes.Any(errorCode => ex.Message.Contains(errorCode)))
        .RetryForever(ex => Console.WriteLine(ex.Message));

    try
    {
        Policy.Wrap(retryForNotSupported, retryForArgument).Execute(FaultyMethod);
    } catch (Exception ex)
    {
        Console.WriteLine(ex);
        Environment.Exit(-1);
    }
    Console.WriteLine("Finished");
}

待装饰功能

代码语言:javascript
代码运行次数:0
复制
static int errorCount = -1;
static void FaultyMethod()
{
    try
    {
        if (++errorCount >= retryableErrorCodes.Length)
            throw new NotSupportedException();
        throw new ArgumentException($"{retryableErrorCodes[errorCount]}");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

如果运行此应用程序,您将看到以下内容:

代码语言:javascript
代码运行次数:0
复制
ORA-03113
Finished

  1. ArgumentException被抛出,ORA-03113
  2. The异常在FaultyMethod中被捕获,它的消息被打印出
  3. ,没有任何重试策略被触发
  4. ,没有异常被PolicyExecute抛出,这就是为什么已完成的被打印

现在,让我们将代码改为抛出NotSupportedException

代码语言:javascript
代码运行次数:0
复制
static void FaultyMethod()
{
    try
    {
        if(++errorCount <= retryTimes)
            throw new NotSupportedException();
        
        //if (++errorCount >= retryableErrorCodes.Length) 
        //    throw new ArgumentException($"{retryableErrorCodes[errorCount]}");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

然后输出将是:

代码语言:javascript
代码运行次数:0
复制
Specified method is not supported.
Specified method is not supported.
Specified method is not supported.
System.NotSupportedException: Specified method is not supported.
...

  1. FaultyMethod抛出NotSupportedException
  2. Its catch块不捕获此exception
  3. Inner重试策略,检查它是否是来自perspective
  4. No,的已处理异常--这不是--这就是为什么它将问题升级到外部策略
  5. 外部重试策略,检查它是否是来自perspective
  6. Yes,的已处理异常这就是为什么它在启动一个新的重试NotSupportedException
  7. Main's
  8. 之前等待1秒的原因--这个完全相同的序列(从1到6)在外部策略达到重试计数阈值时再重复2次
  9. ,然后它将抛出原始的异常,exits

try-catch会捕捉到这个异常,然后打印出来。

因此,如果您从FaultyMethod中删除了try-catch

代码语言:javascript
代码运行次数:0
复制
static void FaultyMethod()
{
    if (++errorCount >= retryableErrorCodes.Length)
        throw new NotSupportedException();
    throw new ArgumentException($"{retryableErrorCodes[errorCount]}");
}

然后输出将如下所示:

代码语言:javascript
代码运行次数:0
复制
ORA-03113
ORA-03114
ORA-12543
ORA-12170
ORA-12154
Specified method is not supported.
Specified method is not supported.
Specified method is not supported.
System.NotSupportedException: Specified method is not supported.

(infinite)

  • All
  • All ArgumentException由内部策略处理,不超过其重试计数,外部策略在超过其重试计数(3)

之前对NotSupportedException进行处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67330054

复制
相关文章
保存并退出vi的命令_vim退出并保存
vi(vim)是上Linux非常常用的代码编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim
全栈程序员站长
2022/11/11
8.2K0
vim 退出命令(保存、放弃保存)_linux保存并退出vim
今天第一次接触这个vim文本编辑器,拿到一个陌生的工具,我们想的当然是最短的时间掌握它的基本操作,体会到成就感。如果你跟我一样,那么这篇教程或许对你有所帮助。
全栈程序员站长
2022/09/23
19.7K0
【Spring注解驱动开发】使用@ComponentScan自动扫描组件并指定扫描规则
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
6050
如何使用Dismember扫描内存并搜索敏感信息
关于Dismember  Dismember是一款针对Linux内存安全的测试与扫描工具,该工具本质上是一个基于命令行的工具,专为Linux操作系统而设计,可以帮助广大研究人员扫描Linux系统上的所有进程,并尝试从中搜索常见的敏感信息或自定义的正则表达式匹配项。 该工具基于Go语言开发,目前仍在积极开发阶段,之后可能会升级为一个完整的渗透测试工具。  工具要求  该工具基于Go语言开发,因此我们首先需要在本地设备上安装并配置好Go语言环境。接下来,广大研究人员可以使用下列命令将该项目源码克隆至本地:
FB客服
2023/03/29
5680
如何使用Dismember扫描内存并搜索敏感信息
小程序生成图片并保存
自己做过几个小程序生成图片并保存的功能,觉得做这个功能用到的还挺多的,记录一下。 总体可以分为: 前端处理:后端返回数据,前端自己将图片、文字等画到 canvas 上,然后转图片。 后端处理:后端直接返回图片,前端只做保存功能。 #前端处理 #绘制 Canvas 并保存 小程序有强大的 canvas 可以转成图片并保存,具体API看 文档 。 但是 canvas 的原生操作过于啰嗦,比如画一个字上去: const ctx = wx.createCanvasContext('myCanvas') ctx.s
九旬
2020/10/23
2.8K0
旋转图像并保存到相册
支持Android 5.0到10,全节点分析不限分辨率,OpenCV图色识别 JS编程简单易学,
用户3519280
2023/07/07
1700
使用Python批量提取并保存docx文档中的图片
如果实在看不懂上面的代码,但是又有同样的功能需要,可以把test.docx文件复制一份并把扩展名改为zip,文件名为“test_副本.zip”,然后解压缩,可以直接在word\media文件夹中得到文档中的图片,如下图所示。当然也可以把这个过程使用Python实现自动化,使用标准库zipfile和os就可以实现。
Python小屋屋主
2018/12/18
3.1K0
使用Python采集京东商品评论并保存至本地
不知道各位网购的时候,是否会去留意商品评价,有些小伙伴是很在意评价的,看到差评就不想买了,而有些小伙伴则是会对差评进行理性分析,而还有一类人不在乎这个。京东作为中国最大的电商平台之一,拥有大量的商品评论数据,了解用户对商品的评价和反馈对于企业和消费者来说都非常重要。
小白学大数据
2023/10/10
9710
vim中保存退出命令_linux保存并退出vim
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172525.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/25
12.4K0
使用 Kotlin 实现 Y 组合子(Y-Combinator)使用 Kotlin 实现 Y 组合子(Y-Combinator)《Kotlin极简教程》正式上架:
使用 Kotlin 实现 Y 组合子(Y-Combinator) 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎随时与我交流~ ---- 我们可以使用 Kotlin FP (Lambda
一个会写诗的程序员
2018/08/17
7260
python 下载网页并保存 脚本
import sys, os, urllib.request, urllib.parse showlines = 6 try: servername, filename = sys.argv[1
用户5760343
2022/05/13
1K0
Nmap扫描结果的保存和输出 原
该选项可将扫描结果以标准格式、XML格式和Grep格式一次性保存,分别放在.nmap,.xml和.gnmap文件中。
青木
2019/04/09
7.8K0
如何使用ChopChop扫描终端并识别暴露的敏感内容
ChopChop是一款功能强大的命令行工具,可以帮助广大研究人员针对Web应用程序进行动态应用程序测试。该工具的主要目的是扫描终端节点,并识别暴露的敏感服务、文件和目录。开发人员还可以在配置文件中声明检测项和签名,所有内容均支持配置,配置文件为chopchop.yml。
FB客服
2022/01/05
1.1K0
如何使用ChopChop扫描终端并识别暴露的敏感内容
如何使用python提取pdf表格及文本,并保存到excel
pdf是一种便携式文档格式,由Adobe公司设计。因为不受平台限制,且方便保存和传输,所以pdf非常受欢迎。
朱卫军 AI Python
2022/04/03
3K0
如何使用python提取pdf表格及文本,并保存到excel
vue生成二维码并保存图片_vue实现扫描二维码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1.3K0
Nmap 扫描并生成HTML报告
1.扫描并生成xml执行命令 nmap -PR -sV -oX lyshark.xml 192.168.1.0/24
微软技术分享
2022/12/28
2K0
Nmap 扫描并生成HTML报告
如何使用Python提取PDF表格及文本,并保存到Excel
PDF是一种便携式文档格式,由Adobe公司设计。因为不受平台限制,且方便保存和传输,所以PDF非常受欢迎。
IT阅读排行榜
2021/04/20
5K0
如何使用Python提取PDF表格及文本,并保存到Excel
2022-03-11:int n, int[][] roads, int x, int y, n表示城市数
2022-03-11:int n, int[][] roads, int x, int y,
福大大架构师每日一题
2022/03/11
6950
Oracle 定时获取并保存StatPack 报告
StatsPack 是9i使用的性能分析工具,如果建立数据库的时候没有,可以手动创建
bsbforever
2020/08/19
3500
点击加载更多

相似问题

在Windows10上安装OrientDB时出错

13

在Windows10 Pro上安装NLTK时出错

35

在Windows10(Python3.8.3)上安装TensorFlow时出错

11

在Windows10上安装PyInstaller for Python3.7时出错

517

在vscode Windows10上安装web3时出错

1185
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文