鱼C论坛

 找回密码
 立即注册
查看: 3197|回复: 18

[已解决]这样的报错信息如何捕获啊

[复制链接]
发表于 2022-8-8 15:55:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
apscheduler中的信息,这种信息如何才能捕获到呢?尝试了好几种异常和警告的方式都不行

微信图片_20220808155523.png
最佳答案
2022-8-11 23:28:38
cdzjf 发表于 2022-8-10 23:46
这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python ...

用多线程捕获内容
import io
import sys
import threading
import time
from contextlib import redirect_stderr

from apscheduler.schedulers.blocking import BlockingScheduler

stringio = io.StringIO()

sys.stderr = stringio


def abc():
    pass


def listen():
    while True:
        val = stringio.getvalue()
        if val:
            print("捕获:", val)
            stringio.__init__()
        else:
            print("没有捕获内容")
        time.sleep(1)


thread = threading.Thread(target=listen)
thread.setDaemon(True)
thread.start()


scheduler = BlockingScheduler(timezone="Asia/Shanghai")
scheduler.add_job(func=abc, trigger="date", run_date="2022-08-07 22:03:03")

with redirect_stderr(stringio):
    scheduler.start()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-8 16:15:25 | 显示全部楼层
自己写一个啊,判断输入的字符,  异常就直接 raise 一个异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 16:21:41 | 显示全部楼层
这不是报错,这是你使用的模块的log信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-8 18:29:18 | 显示全部楼层
z5560636 发表于 2022-8-8 16:15
自己写一个啊,判断输入的字符,  异常就直接 raise 一个异常

就是捕获不到这一行,只能看到打印出来,没有办法用其他方式获取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-8 18:29:50 | 显示全部楼层
hrpzcf 发表于 2022-8-8 16:21
这不是报错,这是你使用的模块的log信息。

怎么捕获?就是定时任务的错误信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 07:44:43 | 显示全部楼层
发代码啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 09:16:12 From FishC Mobile | 显示全部楼层
cdzjf 发表于 2022-8-8 18:29
怎么捕获?就是定时任务的错误信息

捕获?你是想像捕获异常一样吗?恐怕不行。
不过可以把它的输出重定向到某个流然后读取它打印的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 12:58:22 | 显示全部楼层
看了一下这个库的文档,应该是提供了一个 add_listener 方法可以来注册特定事件触发的回调函数,同时事件列表里也有 EVENT_JOB_MISSED ,可能和这个日志的输出有关。您可以尝试注册对应的监听器来捕获信息,具体的还是要根据您的需求和实现参照文档。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 14:48:30 | 显示全部楼层
hrpzcf 发表于 2022-8-9 09:16
捕获?你是想像捕获异常一样吗?恐怕不行。
不过可以把它的输出重定向到某个流然后读取它打印的内容。

这个怎么做呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 14:49:00 | 显示全部楼层

apscheduler,设置一个已经过去的时间就会出现这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 15:17:20 | 显示全部楼层
本帖最后由 hrpzcf 于 2022-8-9 15:19 编辑
cdzjf 发表于 2022-8-9 14:48
这个怎么做呢?

import io
from contextlib import redirect_stdout, redirect_stderr

f = io.StringIO()
# with redirect_stderr(f):
# 或下面这个,用哪个由log往标准输出流还是标准错误流输出决定
with redirect_stdout(f):
    pass
    # 写任何引发输出的代码

print(f.getvalue())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 20:27:29 | 显示全部楼层

请帮忙看看这个代码

from apscheduler.schedulers.blocking import BlockingScheduler
def abc():
    pass

scheduler = BlockingScheduler(timezone='Asia/Shanghai')
scheduler.add_job(func=abc, trigger='date', run_date='2022-08-07 22:03:03')
scheduler.start()

执行这个就会打印
Run time of job "abc (trigger: date[2022-08-07 22:03:03 CST], next run at: 2022-08-07 22:03:03 CST)" was missed by 1 day, 22:23:09.748884

我就是想捕获这段警告,用你的方法应该怎么做呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 19:04:26 | 显示全部楼层
cdzjf 发表于 2022-8-9 20:27
请帮忙看看这个代码

from apscheduler.schedulers.blocking import BlockingScheduler

我试了,scheduler.start()是阻塞性方法,运行后会一直阻塞在这个方法中,用我的那个办法不能在scheduler.start()结束前获取内容。也许你需要把程序打包为exe,然后用subprocess模块运行exe来获取它输出的内容。或者你需封装一个TextIOWrapper,然后把程序的输出流重定向到你封装的TextIOWrapper上(不确定是否有用)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 19:48:19 | 显示全部楼层
八楼dolly 说的应该是正确的方向。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-10 23:46:48 | 显示全部楼层
hrpzcf 发表于 2022-8-10 19:04
我试了,scheduler.start()是阻塞性方法,运行后会一直阻塞在这个方法中,用我的那个办法不能在scheduler ...

这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python这个到度算什么?不是警告吗?那还为啥不能捕获到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-10 23:49:19 From FishC Mobile | 显示全部楼层
cdzjf 发表于 2022-8-10 23:46
这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python ...

前面不是说了吗,这是aps啥的模块的log,日志。它是往标准错误流输出的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-11 23:28:38 | 显示全部楼层    本楼为最佳答案   
cdzjf 发表于 2022-8-10 23:46
这个就很麻烦了,本来是要获取这个警告字段来做其他用途,如果都打包了再来获取就没有实际意义了
python ...

用多线程捕获内容
import io
import sys
import threading
import time
from contextlib import redirect_stderr

from apscheduler.schedulers.blocking import BlockingScheduler

stringio = io.StringIO()

sys.stderr = stringio


def abc():
    pass


def listen():
    while True:
        val = stringio.getvalue()
        if val:
            print("捕获:", val)
            stringio.__init__()
        else:
            print("没有捕获内容")
        time.sleep(1)


thread = threading.Thread(target=listen)
thread.setDaemon(True)
thread.start()


scheduler = BlockingScheduler(timezone="Asia/Shanghai")
scheduler.add_job(func=abc, trigger="date", run_date="2022-08-07 22:03:03")

with redirect_stderr(stringio):
    scheduler.start()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 16:32:41 | 显示全部楼层
hrpzcf 发表于 2022-8-11 23:28
用多线程捕获内容

确实是可以,但我想知道
stringio.getvalue()这个具体是做什么的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 17:10:35 | 显示全部楼层
cdzjf 发表于 2022-8-13 16:32
确实是可以,但我想知道
stringio.getvalue()这个具体是做什么的呢


stringio.getvalue()是获取重定向到stringio中的文本。
代码中sys.stderr = stringio这句是多余的,忘记删了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表