异常和日志记录

Python 爬虫的异常处理与日志记录技巧 假设我们要爬取一个招聘网站的职位信息,包括职位名称、公司名称、薪资、工作地点等。我们将通过实战案例展示如何在爬虫中应用异常处理和日志记录技巧。通过本文的介绍,我们了解了 Python 爬虫中的异常处理和日志记录技巧,并通过实战案例展示了如何在爬虫中应用这些技巧。异常处理和日志记录在网络爬虫开发中非常重要,可以帮助我们提高爬虫的稳定性和可维护性。希望本文能帮助你在网络爬虫开发中更好地应用这些技巧。try-except。 阅读详情
异常和日志记录 英文原文
内容:
开始
链式异常
堆栈访问
日志记录
完整的示例
参考资料
关于作者
对本文的评价
相关内容:
Logging Toolkit for Java
LogKit
Java Exception Handling
在 Java 专区中还有:
教学
工具与产品
代码与组件
所有文章
实用技巧
使用 J2SE 的这些有用的改变来根除问题并适当地响应

John Zukowski(jaz@zukowski.net)
总裁,JZ Ventures 公司
2001 年 12 月

为了理解问题的根源并适当地响应,Merlin 发行版添加了几个与异常处理相关的功能。现在,您不必手工分析堆栈转储信息就可以检查堆栈跟踪信息,并且可以把异常连成一条菊花链,这样就能够在重新抛出异常时附加上异常的原因,这会大大促进调试工作。此外,现在还有一个内建的日志记录工具用来记录消息的不同级别。在 Merlin 的魔力系列的这一部分,John Zukowski 演示了这些新的日志记录和异常功能的工作原理并提供了一个示例程序以供查看和下载。

这个 Merlin 发行版中新添加的许多功能(比如异常处理和日志记录功能),并不象其它一些功能一样显著或令人兴奋,但它们很有用,值得我们关注。所有的 Java 开发者应该都熟悉执行异常处理的基本结构:把可能抛出异常的代码放在 try 块中,然后,万一在这个块中确实抛出了异常,则由这个块下面的 catch 子句来处理。在这个 Merlin 发行版中,这个基本结构并没有发生改变。发行版 1.4 中的新功能是如果从 catch 子句重新抛出了一个异常,您可以附加上该异常的初始原因。这真是一个便于调试的高招!并且,如果您想记录下异常发生在何处,您不必手工分析堆栈跟踪信息。现在支持通过程序的方式访问堆栈跟踪数据,还有一个“日志记录 API”(Logging API)用于记录这些数据(或其它任何内容)。

下面是这个月我们要讨论的新功能的列表:

  • 链式异常工具
  • 以程序的方式访问堆栈跟踪信息
  • 日志记录 API

开始
清单 1 中的基本程序包含三个方法,这三个方法都可抛出异常。每个异常情况通过显示一条消息来处理。在第一个例子中,异常被重新抛出以便显示针对该问题的第二条消息。

清单 1. 异常处理的骨架程序


import java.io.*;

public class Exceptions {

  private static void fileAccess() throws IOException {
    // Fails because prefix is too short
    File f = File.createTempFile("x", "y");
  }

  private static void divZero() {
    System.out.println(1/0);
  }

  private static void arrayAccess(String array[]) {
    System.out.println("First: " + array[0]);
  }

  public static void main(String args[]) {
    try {
      try {
        fileAccess();
      } catch (Exception e) {
        System.err.println("Prefix too short");
        throw e;
      }
    } catch (Exception cause) {
      System.err.println("Cause: " + cause);
    }
    try {
      divZero();
    } catch (Exception e) {
      System.err.println("Division by Zero");
      e.printStackTrace();
    }
    try {
      arrayAccess(args);
    } catch (Exception e) {
      System.err.println("No command line args");
    }
  }
}

链式异常
一个链式异常是这样一种异常,它允许您将一个“成因”异常附加到正在抛出的异常。本质上,您是在创建一条异常菊花链。例如,当抛出(和捕获)您的定制异常时,您可以说导致该异常的原因是一个 I/O 异常。支持链式异常是从 java.lang.Throwable 类开始的。现在,不是只有两个构造函数(其中一个无参数,另一个接受一条详细消息作为参数),而是有四个构造函数:

  • Throwable()
  • Throwable(String message)
  • Throwable(Throwable cause)
  • Throwable(String message, Throwable cause)

当创建自己的异常类型时,您还应该另外添加两个构造函数。那样,您就可以在异常被创建时,很容易地传递产生该异常的原因。即使不改变您的 Exception 子类,您仍然可以将它们链接起来。这个方法只要求您调用自己子类的 initCause(Throwable cause) 方法。

要演示链接,清单 2 应该替换 Exceptions 类中的前两个 try 块。它定义一个定制异常类(同时附加上原因),并抛出这个定制异常类而不是 fileAccess() 异常处理的初识异常:

清单 2. 链式异常代码


try {
  try {
    fileAccess();
  } catch (Exception e) {
    class TheException extends Exception {
      public TheException() {
      }
      public TheException(String message) {
        super(message);
      }
      public TheException(Throwable throwable) {
        super(throwable);
      }
      public TheException(String message, Throwable throwable) {
        super(message, throwable);
      }
    }
    TheException theExc = new TheException("Prefix too short", e);
    throw theExc;
  }
} catch (Exception cause) {
  System.err.println("Cause: " + cause);
  System.err.println("OriginalCause: " + cause.getCause());
}

堆栈访问
现在,我们将通过访问异常的堆栈跟踪信息来增加一点复杂性。如清单 2 中第二个方法调用所示,可以调用 printStackTrace() 来显示通向抛出异常的代码行的调用序列的堆栈转储信息。printStackTrace() 方法可以接受 PrintStream 或 PrintWriter 作为参数,并且如果不为该方法提供目的地的话,它将把输出发送到 System.err。

如果您希望以自己的格式来显示堆栈跟踪信息,而不是以缺省的格式来转储,您可以调用 getStackTrace() 方法,该方法将返回一个 StackTraceElement 对象数组。您可以发现每个元素的许多不同的功能:

  • getClassName()
  • getFileName()
  • getLineNumber()
  • getMethodName()
  • isNativeMethod()

通过调用每个元素的不同方法,您可以用任何自己喜欢的格式来显示堆栈转储信息。用清单 3 取代 printStackTrace() 调用将会使程序显示每个堆栈元素的文件名、行号和方法名称。

清单 3. 手工显示堆栈跟踪信息


StackTraceElement elements[] = e.getStackTrace();
for (int i=0, n=elements.length; i<n; i++) {
  System.err.println(elements[i].getFileName() + ":" + 
    elements[i].getLineNumber() + " ==> " +
    elements[i].getMethodName()+'()");
}

有一点要注意:数组的第一个元素(而不是最后一个元素)是这个调用跟踪的栈顶。

日志记录
不想把堆栈跟踪信息发送到 System.err,您可以使用新的 java.util.logging 包中提供的 Java 平台的日志记录工具。虽然通过 XML 和过滤有许多配置选项可用,但基本结构还是要求获得一个 Logger 对象并使用一般的 log(Level level, String message) 方法对方法进行日志记录,或调用针对特别日志级别的方法(如 fine())。有七个不同的级别,另加两个指明“全部”或“无”的级别:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST
  • ALL
  • NONE

清单 4 向第三个 try 块添加了日志记录功能,只记录堆栈跟踪每部分的方法名称。

清单 4. 基本日志记录器用法


System.err.println("No command line args");
Logger logger = Logger.getLogger("net.zukowski.ibm");
StackTraceElement elements[] = e.getStackTrace();
for (int i=0, n=elements.length; i<n; i++) {
  logger.log(Level.WARNING, elements[i].getMethodName());
}

缺省情况下,日志记录消息被发送到控制台。可以通过为 LogManager 附加一个 Handler 将日志记录添加到文件,如清单 5 所示。

清单 5. 将日志记录添加到文件


try {
  LogManager manager = LogManager.getLogManager();
  Handler handler = new FileHandler("zuk.log");
  manager.addGlobalHandler(handler);

  // log it
      
} catch (IOException logException) {
  System.err.println("Logging error");
}

当控制台输出格式不是任何一种易于分析的格式时,文件输出存储为 XML 文档。清单 6 显示了这个示例的这种输出。

清单 6. 样本日志文件输出


<?xml version="1.0" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2001-10-30T16:24:23</date>
  <millis>1004563463843</millis>
  <sequence>0</sequence>
  <logger>net.zukowski.ibm</logger>
  <level>WARNING</level>
  <class>Exceptions</class>
  <method>main</method>
  <thread>10</thread>
  <message>arrayAccess</message>
</record>
<record>
  <date>2001-10-30T16:24:24</date>
  <millis>1004563464015</millis>
  <sequence>1</sequence>
  <logger>net.zukowski.ibm</logger>
  <level>WARNING</level>
  <class>Exceptions</class>
  <method>main</method>
  <thread>10</thread>
  <message>main</message>
</record>
</log>

完整的示例
清单 7 提供了一个完整的示例以供您试验这些新功能。

清单 7. 完整的示例


import java.io.*;
import java.util.logging.*;

public class Exceptions {

  private static void fileAccess() throws IOException {
    // Fails because prefix is too short
    File f = File.createTempFile("x", "y");
  }

  private static void divZero() {
    System.out.println(1/0);
  }

  private static void arrayAccess(String array[]) {
    System.out.println("First: " + array[0]);
  }

  public static void main(String args[]) {
    try {
      try {
        fileAccess();
      } catch (Exception e) {
        class TheException extends Exception {
          public TheException() {
          }
          public TheException(String message) {
            super(message);
          }
          public TheException(Throwable throwable) {
            super(throwable);
          }
          public TheException(String message, Throwable throwable) {
            super(message, throwable);
          }
        }
        TheException theExc = new TheException("Prefix too short", e);
        throw theExc;
      }
    } catch (Exception cause) {
      System.err.println("Cause: " + cause);
      System.err.println("OriginalCause: " + cause.getCause());
    }
    try {
      divZero();
    } catch (Exception e) {
      System.err.println("Division by Zero");
      StackTraceElement elements[] = e.getStackTrace();
      for (int i=0, n=elements.length; i<n; i++) {
        System.err.println(elements[i].getFileName() + ":" + 
          elements[i].getLineNumber() + " ==> " +
          elements[i].getMethodName()+'()");
      }
    }
    try {
      arrayAccess(args);
    } catch (Exception e) {
      System.err.println("No command line args");

      try {
        LogManager manager = LogManager.getLogManager();
        Handler handler = new FileHandler("zuk.log");
        manager.addGlobalHandler(handler);
    
        Logger logger = Logger.getLogger("net.zukowski.ibm");
        StackTraceElement elements[] = e.getStackTrace();
        for (int i=0, n=elements.length; i<n; i++) {
          logger.log(Level.WARNING, elements[i].getMethodName());
        }
      } catch (IOException logException) {
        System.err.println("Logging error");
      }
    }
  }
}

参考资料

关于作者
John Zukowski 的照片John Zukowski 通过
JZ Ventures 公司从事战略性 Java 咨询,同时还担任一些 jGuru 的由社区推动的 Java 常见问题解答的常驻指导。他最近的著作有 Apress 出版的 Java Collections 和 Definitive Guide to Swing for Java 2 (第 2 版)。可以通过 jaz@zukowski.net 与他联系。
http://www-900.ibm.com/developerWorks/cn/java/j-merlin/index8.shtml
Java 领域 log4j 日志记录的异常捕获与处理 在 Java 开发中,日志记录是一项至关重要的工作,它能够帮助开发者在程序运行过程中追踪问题、监控系统状态等。而 log4j 是 Java 领域中广泛使用的日志框架,它提供了强大的日志管理功能。本文的目的是详细介绍如何使用 log4j 进行异常捕获与处理,范围涵盖了 log4j 的基本概念、异常捕获的核心算法、实际项目中的应用以及相关资源的推荐等方面。本文将按照以下结构进行阐述:首先介绍相关背景知识,包括目的、读者和文档结构等;接着讲解 log4j 的核心概念与联系,包括其架构和与异常处理的关联; 阅读详情

相关推荐

掌握异常处理与日志记录的最佳实践

本文探讨了Java中异常处理和日志记录的最佳实践。我们了解到传递异常通常优于捕获异常,断言在测试阶段的使用,以及日志记录对于程序调试和运行时信息追踪的重要性。文章详细阐述了异常处理的规则,断言的概念、启用和禁用方法,以及如何利用日志记录API来提高程序的可维护性和调试效率。

weixin_42372837的博客 998

异常日志规范

异常日志规范

xike1024的博客 1158

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

【SpringBoot】日志处理-异常日志(Logback)

使用 Logback 作为日志框架时,可以通过配置文件来设置日志的输出格式、输出位置以及日志级别。以下是如何配置 Logback 以实现异常日志在控制台打印以及写入日志文件。可以直接使用 SLF4J(Simple Logging Facade for Java)的 API 来记录日志,Logback 会作为其实现。文件夹下,可以看到已经按照我们设定的命名规则生成了 log 文件。去到日志文件存储地址,已经生成了以日期为文件名的文件夹。日志文件存储地址为 D 盘的 logs 文件夹下。

m0_66584716的博客 839

【计算机视觉40例】案例08:石头剪刀布手势识别

计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。......

计算机视觉之光 2157

Autosar结合simulink的汽车应用层软件开发实例

本文基于汽车应用开发案例,并结合Autosar相关知识,生成具有Autosar标准的汽车应用层开发代码,以供学习和参考。以上就是本篇内容,主要是利用Simulink创建Autosar接口并进行端口映射的方法。

m0_64899535的博客 2153

异常与日志

异常 本章技能目标 熟悉使用try-catch-finally处理异常 会使用throw、throws抛出异常 掌握异常及其分类 使用log4j记录日志 1. 异常概述 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。 程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。 编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程

weixin_40154786的博客 991

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

计算机组成与系统结构(第三版) 袁春风主编 课后习题答案讲解 第一、二章 计算机系统概述 数据的机器级表示

qq_73523062的博客 2094

记录异常日志的7条规则

最近一直在帮忙调试一些让人头大的bug问题,这才意识到如何记录异常日志对于简化调试的重要性,我总结了几点记录异常日志的最佳实践发表在此。 1、记录技术性异常而不是用户异常 用户异常(如:“登录用户名已经存在”)除了显示给用户,要么什么都别管,要么根本就不是异常(“用户尚未认证”)。技术性异常(如:“文件存储不够,没法订阅此产品”)才是你需要调试而为此做出反应的,如果你记录所有事情很有...

iteye_16521的博客 562

FPGA面试题目笔记(一)——FPGA开发流程、亚稳态和竞争冒险、建立保持时间、异步FIFO深度等

同步异步电路、同步异步复位、时钟偏移和抖动、最小工作周期计算、触发器锁存器

H19981118的博客 1万+

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!文末提供下载地址。 下载地址: 链接:https://pan.baidu.com/s/11S6XDq9Eaa3DG3VKRMBIPg

智慧空间实验室 1019

异常:异常与记录日志

/* *  2018年3月28日09:26:29 *   代码目的: *       演示异常与记录日志的使用。 *       java.util.logging工具将输出记录到日志中。 *       日志消息被转发到已注册的 Handler 对象, *       该对象可以将消息转发到各种目的地,包括控制台、文件、OS 日志等等。  *       静态的Logger.getLogge...

不当初 2990

STM32实战开发(120):基于STM32的智能pH值检测系统开发

pH值检测:通过pH传感器实时检测溶液的酸碱度。数据采集与处理:STM32单片机通过模拟信号采集并进行数字化处理。数据显示与控制:通过LCD或OLED屏幕实时显示pH值。数据存储与上传:将数据保存在本地SD卡,或通过Wi-Fi模块上传至云平台。低功耗设计:适合长时间运行,减少能源消耗。本文介绍了如何基于STM32单片机开发智能pH值检测系统,涉及硬件设计、软件开发及应用实现。该系统可以实时检测pH值,并将数据展示、存储、上传至云平台,适用于环境监测、农业、水处理等多个领域。

2201_76125393的博客 1818

Java中的高级异常处理与日志记录

本文详细介绍了Java中的高级异常处理与日志记录技术,包括自定义异常、异常链和日志记录的实现方法。通过结合使用Spring AOP,可以实现全局异常处理和统一日志记录,从而提高系统的健壮性和可维护性。良好的异常处理机制可以提高系统的健壮性,而日志记录则为系统的维护和故障排查提供了宝贵的信息。日志记录是软件系统中不可或缺的一部分,能够帮助开发人员在开发、调试和维护阶段跟踪程序的运行状态。在基本的异常处理之外,高级异常处理技术可以进一步增强系统的可靠性和可维护性。在上述代码中,我们定义了一个全局异常处理切面。

技术研究中心 1194

IPCP(IP Control Protocol,IP控制协议)

IPCP(IP Control Protocol,IP控制协议)

天赐好车的博客 757

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Qt-异常捕获以及日志记录

Qt中的异常捕获以及Qt捕获不到异常现象的原因及解决方案,日志的接入及使用方法。

qq_48498725的博客 7567

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C#】日志记录与异常处理

这通常用于异常处理中,当你想要捕获一个异常,并基于这个异常抛出一个新的异常时。需要注意的是,Debug.WriteLine只在调试版本中有效,发布版本中通常会被编译器忽略,除非你使用了条件编译指令(如#if DEBUG)来确保它只在调试版本中执行。将会创建一个新的异常对象,这个新异常将包含 "新的异常消息" 作为其消息,并且会保留原始异常 ex 的堆栈跟踪信息。在生产环境中,如果遇到未实现的功能,更合适的处理方式可能是返回一个错误代码或异常,具体取决于应用程序的设计和需求。日志记录是编程中用于。

m0_61396811的博客 1233

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android全局异常日志记录

在很多时候在自己调试环境中很容易定位BUG找到问题,但是上线后产品出了问题没有环境是很烦恼的,所用添加异常日志记录就大大的方便了自己,这里是一个简单的异常日志记录可定时删除。最后DEMO附上 首先我们要用到两个类和一个调用页面 第一个类:当程序发生Uncaught异常的时候,该类来接管程序,并且记录错误的日志 public class CrashHandler implements Unc...

lizhong 1993

Python中精通异常日志记录

异常日志记录是Python编程中一个不可或缺的部分,是有效程序监控和问题排查的关键。本文介绍了如何使用Python的​​logging​​模块来记录异常,并提供了多种技术来增强记录过程,包括基本的日志记录、将日志输出到文件、格式化日志消息,以及使用装饰器自动化处理异常日志记录。掌握这些技能能够帮助你编写更加健壮、可维护的Python应用程序。

Web安全工具库 605

C# 异常日志记录

C# 异常日志记录

xuan2717的博客 272

实现异常日志记录操作

java本功能实现了 Spring Boot 多模块项目中的全局异常日志记录,具备良好的可扩展性和稳定性,解决了模块之间潜在的循环依赖问题,同时提升了系统的可观测性和运维效率。

weixin_50054449的博客 863

FullStackHero异常处理:全局异常拦截与日志记录

在企业级应用开发中,异常处理是保证系统稳定性和可维护性的关键环节。FullStackHero .NET 8 Starter Kit提供了一套完整的异常处理机制,通过全局异常拦截、自定义异常类型和结构化日志记录,为开发者提供了强大的错误处理能力。 ## 全局异常拦截架构 FullStackHero采用中间件模式实现全局异常处理,核心组件是`ExceptionMiddleware`: ```me...

gitblog_00908的博客 810

JeecgBoot异常处理机制:统一异常处理与日志记录

在企业级应用开发中,异常处理是保证系统稳定性和可维护性的关键环节。JeecgBoot作为一款优秀的企业级低代码平台,提供了一套完善的异常处理机制,通过统一异常处理和智能日志记录,帮助开发者快速定位问题、提升系统健壮性。本文将深入解析JeecgBoot的异常处理架构,带你掌握企业级应用的异常处理最佳实践。 ## 异常处理架构概览 JeecgBoot采用基于Spring Boot的全局异常处理机制...

gitblog_00777的博客 830

Java异常处理与日志记录全指南

在编写程序的过程中,发现程序运行结果与预期不符,怎么办?2001年以前,全凭System.out和System.err打印出执行过程中的某些变量,观察每一步的结果与代码逻辑是否符合,然后有针对性地修改代码。代码改好了怎么办?当然是删除没有用的System.out和System.err语句了。如果改代码又改出问题怎么办?再加上输出语句。反复这么搞几次,很快大家就发现这样非常麻烦。产生大量的IO操作 同时在生产环境中 无法合理的控制是否需要输出输出的内容不能保存到文件。

m0_73863802的博客 792

Python 异常处理与日志记录

异常处理是任何编程语言中的重要组成部分,Python 也不例外。Python 提供了丰富的异常处理机制,让开发者可以更好地管理程序中出现的错误。除了捕获和处理异常外,记录异常信息也是至关重要的,以便日后排查问题和改进程序。本文将介绍如何在 Python 中捕获异常,并将异常信息记录到日志文件中。

一键难忘的博客 4146

异常日志记录 DDLog

异常日志记录 DDLog

weixinhmz的博客 154
上一篇: 通过JavaMail访问Hotmail邮箱
下一篇: JDK 1.4 中打印,
lwqadmin
博客等级 码龄22年 6粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值