sap打勾选项记录_记录意外的开关选项

sap打勾选项记录

Java开发人员可以做很多事情来使自己的生活以及维护该代码的其他人的生活更加轻松。 在本文中,我将探讨开发人员可以采用的一种非常简单的方法,以使每个人都更轻松。 对于每个阅读这篇文章的人来说,这篇文章的要点似乎都很明显,但是我发现这样做的频率比我预期的要少得多。 总之,开发人员通常应记录它们的值开关 ,当该值不被任何明确的表示对-ing case是内声明switch

在进行具体说明之前,我将添加一些警告。 有时,记录switch到的值与case没有明确匹配可能没有意义。 其中一些列在这里。

  • 所打开的值是敏感的,出于安全原因不应记录。
  • 在许多情况下,打开该值都不会导致匹配,因此开发人员不希望不必要地登录。
  • 可以提供一个default值,该default值对于没有匹配case块的任何值都将始终有效(这似乎很少)。

在我所见的情况下,这是导致其成为我主要宠物怒气的原因之一,上述警告均未适用。 实际上,在大多数情况下,开发人员已在default块中提供了一条记录的消息,警告该值是意外的,但同一开发人员未能提供不匹配的候选值。 下一个代码清单显示了一个人为的示例。

枚举default ,不带switch候选值登录

/*** Provides the Roman numeral equivalent of the* provided integer.* * @param integer Integer for which Roman numeral*    equivalent is desired.* @return Roman numeral equivalent of the provided*    integer or empty string ("") if I'm not aware of*    the Roman numeral equivalent.*/
public String getRomanNumeralEquivalent(final int integer)
{String romanNumeral;switch (integer){case 0:romanNumeral = "nulla";break;case 1:romanNumeral = "I";break;case 2:romanNumeral = "II";break;case 3:romanNumeral = "III";break;case 4:romanNumeral = "IV";break;case 5:romanNumeral = "V";break;case 6:romanNumeral = "VI";break;case 7:romanNumeral = "VII";break;case 8:romanNumeral = "VIII";break;case 9:romanNumeral = "IX";break;case 10:romanNumeral = "X";break;default:out.println("Unexpected integer was provided.");romanNumeral = "";break;}return romanNumeral;
}

此处的问题实际上是开发人员应避免的更普遍问题的特定示例:没有足够上下文的日志。 在某些情况下,提供使日志消息更有用的上下文类型可能很困难或计算量很大。 但是,在switch语句中通常不是这种情况,我们可以在其中轻松记录尝试switch的值。 在上面的代码清单中,将仅告诉开发人员在部署中支持运行时问题的开发人员“提供了意外的整数”。 没有任何上下文,很难知道提供的整数是什么,并且如果不知道候选整数,就很难跟踪发生了什么甚至无法重现它。

只需很少的精力就可以使此default日志记录语句有用,这将在下一个代码清单中显示。

构造更好的default日志语句

default:out.println("Unexpected integer (" + integer+ ") was provided, so empty String being returned for Roman Numeral.");romanNumeral = "";

“增强的”日志消息指示正在打开哪个整数,并添加了由于该整数不是期望的整数而返回的内容。 第二部分对于开发人员而言不是必需的,因为静态代码将向开发人员显示在这种“默认”情况下返回的内容。 但是,正在打开的整数的日志记录非常有价值,因为以后没有很好的方法来访问此信息,除非其他地方的其他日志消息清楚地表明正在打开的内容。

我无数次成为开发人员未提供此简单上下文的受害者。 这使原本很容易诊断的事情变得更加困难。 在极端情况下,我必须将此上下文添加到日志消息中,并等待再次遇到它。 如果开发人员在编写代码时添加了简单的上下文信息,则可以更轻松地解决此问题。

在编写自己的switch语句时,我希望将这一概念更进一步。 即使我的switch明确涵盖了所有可能的(当前) case我也通常添加一个default块。 在编写本文时,此default块是不必要的,并且“永远不会被调用”,但是我将其添加到了面向将来的switch语句中(可以使用单元测试来实现类似的保护)。 我添加了提供给switch语句的意外候选值的日志记录,以便在代码“上游”添加另一种情况时,我的switch会在遇到意外值时Swift告诉我,并告诉我该意外值是什么。

通常会发现,在不匹配case情况下为switch语句提供候选值是一种特殊情况。 在这种情况下,抛出异常比仅记录异常情况更合适。 一个标准的异常(例如IllegalArgumentException)可以很好地解决此问题(从某种意义上说,它是switch语句的非法参数),但是我偶尔也编写了一个自定义的异常来帮助解决这个问题。 当我决定实现并使用此自定义异常时,做出该决定的部分原因是抛出该异常会鼓励开发人员提供被打开的对象作为异常构造函数的一部分。 接下来显示此类自定义异常的典型示例。

SwitchOptionNotExpectedException.java

package dustin.examples.switchdemo;/*** Exception used to communicate a candidate value for* a {@code switch} statement not being matched by any* of the explicitly provided {@code case} blocks.*/
public class SwitchOptionNotExpectedException extends RuntimeException
{/*** Object being switched on for which no matching* {@code case} clause existed.*/private final Object switchedObject;/*** Constructor accepting exception message and the instance* upon which the {@code switch} was being attempted when no* matching {@code case} was found.** @param newMessage Exception summary message.* @param newSwitchedObject Object being switched on for*    which there was no explicitly specifed {@code case}.*/public SwitchOptionNotExpectedException(final String newMessage, final Object newSwitchedObject){super(newMessage + " (unable to switch on '" + String.valueOf(newSwitchedObject) + "')");switchedObject = newSwitchedObject;}/*** Constructor accepting the instance upon which the {@code switch}* was being attempted when no matching {@code case} was found.** @param newSwitchedObject Object being switched on for*    which there was no explicitly specified {@code case}.*/public SwitchOptionNotExpectedException(final Object newSwitchedObject){super("Switch statement did not expect '" + String.valueOf(newSwitchedObject)+ "'.");switchedObject = newSwitchedObject;}/*** Provides String representation of the object being* switched upon.** @return String representation of the object being*    switched upon.*/public String getSwitchedObjectString(){return String.valueOf(switchedObject);}/*** Provides type of object being switched upon.** @return Type of the object being switched upon or*    {@code null} if that switched upon object is null.*/public Class getSwitchedObjectType(){return switchedObject != null ? switchedObject.getClass() : null;}
}

开发人员是否只是简单地记录未找到切换候选者或引发异常是对此的响应,通常应记录或将打开的值记录在异常中或包括在异常中,以使诊断问题变得更加容易。 上面的自定义异常将自动提供该消息,而与使用的构造函数无关,只要开发人员提供打开的对象即可。 在这种情况下,开发人员必须竭尽全力不提供该对象,而不仅仅是忽略或忘记包含它。

在排除了不适合登录或写出不匹配值的情况之后,开发人员最有可能无法表明该值的根本原因就是根本没有考虑它。 在编写代码时,对开发人员“显而易见”的是,任何意外情况“都不会发生”,或者如果确实发生了,那么价值是显而易见的。 在这些类型的消息(或与此有关的任何日志消息)中不包括上下文的另一个可能原因是匆忙或懒惰。 开发人员可能知道最好提供这些详细信息,但不想花时间去做。 这是后一个原因,有时会鼓励我编写一个自定义异常,如上所示。

对开发人员来说,调试和维护生产软件是宝贵的经验,因为它可以帮助开发人员更好地了解他们的行为(或缺乏行为)如何使将来的工作更加困难。 通常,有责任心的开发人员可以通过在记录的消息中提供上下文信息来帮助其他人(可能还有他或她自己),特别是对于警告,错误和异常情况。 特别是,增加什么价值的背景下正在switch时没有找到匹配的-ed是很容易做到,可能相当多的时间保存自己,其他开发人员和客户的未来。

翻译自: https://www.javacodegeeks.com/2017/11/log-unexpected-switch-options.html

sap打勾选项记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac OS 的历史

文章目录概述1980年代前20世纪80年代20世纪90年代2000年以后概述 纵观电脑之历史,操作系统与计算机硬件的发展息息相关。 操作系统之本意原为提供简单的工作排序能力,后为辅助更新更复杂的硬件设施而渐渐演化。 从最早的批处理模式开始,分…

linux升级tls,为CentOS升级OpenSSL 让Nginx支持TLS 1.2

最近在调试微信小程序时,发现wx.request请求总是无法正确获取服务器端的数据,经过检查发现是因为服务器端https不支持微信要求的TLS 1.2版本。登录到服务器上,用openssl version -a命令查询,发现版本是0.9.8e,查阅文档…

java 反射 速度_Java反射,但速度更快

java 反射 速度在编译时不知道Java类的最快方法是什么? Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成。 用例 假设我们有一个简单的Person类&#x…

macOS 内核之 OS X 系统的起源

文章目录一、苹果公司早期(1972-1991)二、苹果在操作系统上的尝试(1991-1997)2.1 Star Trek 项目 (1992-1993)2.2 Copland-Mac OS 8 (1994-1996)三、收购与转折(1996-1997)四、NeXT 篇章4.1 NEXTSTEP(1985-1997)4.2 OpenStep(1993-1997)五、Mach 的历史5.1 Rochester’s Intell…

docker create_Docker动手教程2.2:容器基本操作2

内容摘要暂停/取消暂停容器删除容器进入容器创建容器暂停/取消暂停容器暂停容器命令:docker pause 容器ID/容器名注意STATUS列,被暂停的容器的状态依旧是“Up”,但是后面括号显示为“Paused”。取消暂停命令:docker unpause 容器I…

c语言全局变量和局部变量作用域重合时,c语言全局变量与局部变量(当变量重名时)的使用情况...

ABP框架 - 时间文档目录 本节内容: 简介 时钟 客户端 时区 客户端 绑定器与转换器 简介 虽然有些应用目标市场只是在一个时区,有些应用目标市场是许多不同时区,为满足这种需求并集中化日期操作,ABP为日期操作提供公 ...mvc5+ef6+Bootstrap 项目心得--身份验证…

jdbc连接gp单例模式_JDBC连接备忘单

jdbc连接gp单例模式抽象 这是常见数据库的JDBC连接的快速参考。 我似乎必须大量查找此信息&#xff0c;因此我认为最好将所有参考资料放在一个地方。 德比 <dependency><groupId>org.apache.derby</groupId><artifactId>derbyclient</artifactId&g…

关于 Mac OS X 内核技术来源

Mach&#xff08;Multiple Asynchronously Communication Hosts&#xff09; 是一个由卡内基梅隆大学开发的操作系统内核&#xff0c;Mach的开发是为了取代BSD的UNIX核心。 Mach 内核的设计目标之一是要兼容 Unix 系统。 当初他们的设想是&#xff0c;真正的操作系统可以作为一…

得到appd url_AppD方法:Java 9支持

得到appd url通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 阅读有关Java 9模块化功能带来的挑战以及AppDynamics保持在该领域的领导者的严格要求的更多信息。 我们很高兴宣布Java 17全面支持&…

python有趣的面试题_python面试题目

问题一&#xff1a;以下的代码的输出将是什么? 说出你的答案并解释。 class Parent(object): x 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x 2 print Parent.x, Child1.x, Child2.x Parent.x 3 print Parent.x,…

用C语言编程画出图形,C语言图形编程(六) -图形程序设计实例:零件图形的绘制...

实例&#xff1a;一个零件图形的绘制有一个零件图&#xff0c;如下&#xff1a;对图3-1中的零件图形&#xff0c;如何根据它所标注的尺寸&#xff0c;按照适当的顺序有步聚地画出该图形&#xff0c;这首先要分析此零件图形的几何关系&#xff0c;了解构成这个图形各线段的性质&…

Linux 发行版之 CentOS 简介

简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;社区企业操作系统&#xff09;是 Linux 发行版之一&#xff0c;它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c;因此有些要求高…

python异常值如何处理_如何处理异常

python异常值如何处理最近&#xff0c;我与一个朋友进行了讨论&#xff0c;他是一个相对初级但很聪明的软件开发人员。 她问我有关异常处理的问题。 这些问题指出了一种技巧和窍门&#xff0c;肯定有它们的清单。 但是我坚信我们编写软件的方式背后的背景和动机&#xff0c;因此…

c语言测试清单,c语言测试(C language test).doc

c语言测试(C language test)c语言测试(C language test)* * college course exam papersCourse Name: "C: the use of C language programming software to enter the world" (A) volumeGrade: class:Name: ______BUKAILI_________ number: _________________ test (…

mfc怎么获取进程的线程数_Python多线程获取小米应用商店App,看看我是怎么做到的

一、【项目背景】小米应用商店给用户发现最好的安卓应用和游戏,安全可靠&#xff0c;可是要下载东西要一个一个的搜索太麻烦了。而且速度并不是很快。今天小编就教大家利用多线程爬取小米应用商店的游戏模块&#xff0c;快速获取我们想要的软件安装包。二、【项目目标】目标 &a…

Linux Distribution Timeline for 2010(Linux 2010 年发行版时间线/族谱/发展图)

此图来自维基百科&#xff08;wikimedia&#xff09;&#xff0c;具体地址为&#xff1a;https://commons.wikimedia.org/wiki/File:Linux_Distribution_Timeline.svg?uselangzh-hans#filehistory

git强制推送_Git 常用命令

Git 常用命令总结1. GIT 工作区add commitworking directory ------- index(stage) ---------- HEAD | | | | | | 工作目录 暂存区 …

glacier2_Amazon Glacier的Scala客户端

glacier2Amazon Glacier是一项安全&#xff0c;耐用且成本极低的云存储服务&#xff0c;用于数据归档和长期备份。 Glacier提供了一种冷藏数据存档解决方案&#xff0c;这意味着已存储的数据不可立即检索。 您首先需要请求数据检索&#xff0c;访问时间可能从几分钟到几小时不等…

c 调用c语言dll数组,C#调用C类型dll入参为struct的问题详解

前言C# 可以通过 DllImport 的方式引用 C 类型的 dll。但很多 dll 的参数不会是简单的基础类型&#xff0c;而是结构体 struct 。因此就需要在 C# 端定义同样的结构体类型&#xff0c;才能实现调用 C 类型 dll。这里例举几种不同的结构体情况&#xff0c;以及其对应的解决方案。…