青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

sherrylso

C++博客 首頁 新隨筆 聯系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks
不知道大家是否有同感,在開發軟件應用系統的過程中我們經常面臨一個非常tedious的問題,即如何分類和處理軟件行為產生的錯誤值,大致有這樣幾個方面的問題:
        第一.錯誤值如何分類。參考microsoft的開放文檔,按照錯誤值的嚴重程度分為critical、error、warning、information等四個級別。
        第二.錯誤值如何在各個軟件子模塊中有效的表示和溝通。
        第三.如何劃分出用戶所關心的錯誤值集合。
這篇文章對錯誤類型定義與處理作了很好的闡釋。推薦給大家,大家如果有什么好的開發經驗,歡迎探討。
FYI:
Taxonomy of Error Types and Error Handling
Posted: Jun 21, 2007 8:13 PM

Most of what is written about error and exception handling is fairly abstract and vague. When specific recommendations are made, those usually consist of examples given for specific circumstances. Yet, error handling is a fundamental task for developers. This brief review attempts to categorize the different types of error conditions a program can encounter. By describing these categories, I also provide suggestions on how to handle each type of error condition.

In general, errors a program can encounter tend to be the result of one of three things:

  • Restrictions: Arguments to a routine that can never work, and always result in an error, define a restriction on the use of the routine. Ensuring that only correct arguments are passed to a routine is the type of thing that programming by contract is meant to address.
  • Inconsistencies: When values or resources are not what they are expected to be, or are missing, that creates an inconsistency between the expected state of the environment and the actual state. This may be the internal environment, such as a null pointer, or the external environment, such as a corrupt file. It doesn't encompass inconsistencies in the data model, which often needs to be temporarily inconsistent during an operation (e.g. adding a node to a linked list).
  • Failures When an operation simply does not work, and it's out of the program's control, this is a failure. For example, a pulled network cable.

These types of errors overlap to an extent (say, a working network could be considered part of the expected state, making it an inconsistency error). In general, though, most errors can fall into one of these categories.

Sometimes failures are not errors, and are just a way of detecting the current external state. For example, opening a file that doesn't exist may fail, but results in an error only when that file is actually needed.

Error Handling Responsibilities

Program code is responsible for the consistency of the internal program state. Generally certain code has primary (ideally, exclusive) responsibility for parts of the internal state. Inconsistency errors that occur within the code responsible for that state are bugs.

Sometimes the state management responsibility is shared between different sections of code. This is a bad idea, because it makes assigning responsibility for an inconsistency error harder, but it does happen in practice.

It's important to make a distinction between error detection and debugging. Often, data generated in the process of error handling is mixed together with diagnostic information. If possible, these types of information should be kept completely separate—at least conceptually, even if combined in a single data structure.

Safe Zones

Restrictions can be checked before calling a routine, or within a routine. It seems a waste of time to check arguments every time a routine is called when you already know those arguments are correct. One strategy is to separate parameter checking from parameter usage. This doesn't work reliably for library code, where anything can happen between the check and the use of the parameters, but within a base of code for a particular application or within a library, you can restrict the code to not change a value known to be safe.

The code between a parameter check and the next change to a parameter variable is a safe zone, where parameters don't have to be re-checked. This is only valid for restriction errors, because inconsistency and failure errors can be caused by things outside the code's safe zone. Things like critical sections (in multithreaded environments), semaphores and file locks are meant to create a very limited kind of safe zone for inconsistency and failure errors.

The code safe zones for parameters can overlap with others, and may not be well defined. One way to deal with this is to assign known safe values to variables which indicate this safety. Joel Spolsky wrote about one way to do this using variable naming conventions in Making Wrong Code Look Wrong. Safe values should be assigned to variables declared constant.

Reporting Errors

Code calling a routine needs to know three things to decide how to proceed: First, whether the data is returned, if any, or if the method invocation succeeded; second, whether an error occurred; and, third, whether the error is permanent or transitory. This defines the following possible error states returned from a routine:

  1. Successful
  2. Restriction error (always permanent)
  3. Permanent (bug) inconsistency
  4. Transitory (detected) inconsistency
  5. Failure (transitory for all we know)

It's often a bad idea to mix an error code with a return value, such as designating a specific values—say, 0 or -1—to be invalid. Some languages, like Python, allow multiple values to be returned from a method as tuples. A tuple is basically an anonymous class, and can be implemented in a language like Java by defining a class for objects returned by a method, or in C by defining a struct which is passed as a parameter and is updated by the function. But in many cases, exceptions are a much better way to separate error information from return values.

Exceptions transmit an object from the exception location to a handler in a scope surrounding it, or surrounding the point where the routine was called. The exception objects include information by the object type and class, and debugging information the data contained within that type. Exceptions by themselves don't indicate the error state, so that must be included as an attribute of the exception object, or the error state must be deduced from the debugging information (object type and data).

Java introduced the controversial notion of checked exceptions, which must either be caught or declared to be thrown by a method in order to compile, while unchecked (or runtime) exceptions behave like exceptions in other languages. The main cause of the controversy is that there has been no good definition of why there should be a difference and, as a result, no consistent strategy in the implementation in various libraries, including standard parts of the different Java runtime libraries.

In general, unchecked exceptions are meant for bugs, where an error indicates that the code is simply wrong and must be fixed (restriction and bug inconsistency errors). An example is a NullPointerException. Checked exceptions are for detected inconsistency and failure errors, where the program may have a strategy of handling the error. An example is an I/O error.

Transactional Operations

One strategy to handle errors is to make all operations transactional, so that if they fail, it's as if the operation was never tried. One way implement this is to define an "undo" operation for every change:

Ideal transactional function

In this example, the functions are also transactional, and thus don't need to be rolled back if they fail. This can be done with nested if/else blocks, or with nested try/catch blocks. If the "undo" operations themselves have errors, the result looks more like this:

Realistic transactional function

One way of dealing with this is to modify a copy of the program state, and if all operations succeed, only then commit the changes. The commit may fail, but this isolates the possible state changing errors to one point, and is similar how databases implement transactions. Another way to implement transactional operations is to make a copy of before any state is changed, and use that copy to restore the expected state, in case of an error.

In summary, having a clear taxonomy of error conditions that code may encounter helps develop better strategies for dealing with, and possibly recovering from, those errors.

posted on 2007-07-15 18:31 愛上龍卷風 閱讀(1141) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人网在线| 久久精品国产在热久久 | 亚洲国产一成人久久精品| 一本大道久久a久久精品综合 | 亚洲综合第一页| 亚洲午夜精品久久久久久app| 亚洲精品国产精品国自产在线 | 欧美福利精品| 欧美色欧美亚洲另类七区| 国产精品久久毛片a| 国产女主播视频一区二区| 性欧美超级视频| 欧美一区成人| 久久久综合网| 欧美伦理视频网站| 国产精品夜色7777狼人 | 国产日产欧美一区| 在线看不卡av| 亚洲一级特黄| 久久五月激情| 亚洲黄色在线| 亚洲欧美日韩成人| 母乳一区在线观看| 国产精品久久二区二区| 好吊色欧美一区二区三区视频| 在线观看视频免费一区二区三区| 国产精品视频精品视频| 亚洲永久在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲国产日韩在线一区模特| 亚洲一级高清| 女同性一区二区三区人了人一| 欧美日韩一区二区三区| 狠狠色狠狠色综合日日小说| 亚洲精品欧美极品| 久久久九九九九| 一本久久综合亚洲鲁鲁五月天| 久久天天狠狠| 国产欧美短视频| 一区二区三区蜜桃网| 老司机aⅴ在线精品导航| 在线视频中文亚洲| 欧美国产精品一区| 一区在线影院| 欧美在线播放高清精品| 亚洲精品欧美极品| 猫咪成人在线观看| 国产一区日韩二区欧美三区| 亚洲免费人成在线视频观看| 亚洲电影免费在线观看| 久久亚洲精品视频| 亚洲成人在线视频网站| 欧美v日韩v国产v| 久久精品欧美日韩精品| 国产一区二区三区高清| 欧美一区亚洲二区| 午夜国产精品视频| 国产伊人精品| 久久久久久自在自线| 欧美亚洲三级| 黄色成人在线网站| 免费不卡欧美自拍视频| 久久久91精品| 亚洲电影天堂av| 欧美国产免费| 欧美承认网站| 亚洲私人影院在线观看| 日韩亚洲精品在线| 欧美日韩在线第一页| 亚洲最新合集| 日韩亚洲精品电影| 欧美二区乱c少妇| 一区二区三区日韩精品视频| 欧美激情在线有限公司| 麻豆av一区二区三区久久| 国产女人精品视频| 午夜一级在线看亚洲| 99v久久综合狠狠综合久久| 亚洲精品资源美女情侣酒店| 欧美午夜精品久久久久免费视| 亚洲经典在线| 亚洲国产精品毛片| 欧美高清视频| 夜夜夜久久久| 夜夜嗨av一区二区三区| 欧美午夜国产| 久久色在线播放| 亚洲小说欧美另类社区| 亚洲一区二区三区国产| 欧美日韩国产免费观看| 日韩小视频在线观看| 亚洲国产婷婷| 欧美紧缚bdsm在线视频| 中文亚洲免费| 亚洲一级在线观看| 国产日韩欧美一区在线 | 国产精品亚洲一区二区三区在线| 亚洲男人影院| 午夜精品亚洲| 黄色成人片子| 亚洲欧洲一区| 国产精品萝li| 亚洲欧美日韩精品综合在线观看| 制服丝袜亚洲播放| 国产有码在线一区二区视频| 亚洲精品久久久久久一区二区| 欧美精品在线视频| 亚洲男同1069视频| 久久夜色精品亚洲噜噜国产mv| 91久久在线| 亚洲电影第1页| 国产精品黄视频| 美女黄毛**国产精品啪啪 | 亚洲午夜一二三区视频| 亚洲高清自拍| 国产精品午夜在线| 欧美激情亚洲一区| 国产精品高清一区二区三区| 久久久国产精彩视频美女艺术照福利| 毛片一区二区三区| 在线视频国产日韩| 久久精品国产999大香线蕉| 日韩网站在线看片你懂的| 亚洲欧美一区二区在线观看| 亚洲精品欧美专区| 欧美在线高清视频| 亚洲专区在线| 欧美成人第一页| 亚洲手机视频| 欧美日韩中文字幕综合视频| 男女av一区三区二区色多| 欧美午夜精品电影| 亚洲激情国产精品| 韩日午夜在线资源一区二区| 亚洲一区二区三| 一区二区精品国产| 蜜桃av一区二区| 久久久青草青青国产亚洲免观| 欧美日韩精品免费观看视频| 欧美大成色www永久网站婷| 国产香蕉97碰碰久久人人| 日韩网站免费观看| 亚洲激情精品| 久久亚洲综合网| 欧美a级一区二区| 一本综合精品| 久久精品一本久久99精品| 亚洲一区在线观看免费观看电影高清| 久久综合亚州| 久久久亚洲影院你懂的| 国产精品麻豆va在线播放| 久久先锋资源| 亚洲欧洲一二三| 欧美黄色成人网| 亚洲国产精品久久久久秋霞不卡| 最新69国产成人精品视频免费| 久久久久国产精品一区二区| 久久久精品一品道一区| 欧美视频四区| 欧美一区精品| 久久婷婷国产综合国色天香| 国产午夜亚洲精品不卡| 性亚洲最疯狂xxxx高清| 久久久高清一区二区三区| 国产欧美在线视频| 欧美在线免费播放| 久久精品噜噜噜成人av农村| 国产欧美日韩另类视频免费观看| 亚洲尤物在线| 久久久综合网站| 影音先锋亚洲精品| 欧美第一黄网免费网站| 久久影院午夜论| 99国产精品国产精品毛片| 欧美精品国产精品日韩精品| 亚洲激情国产| 亚洲一区国产| 国产日韩视频| 久久久久国色av免费观看性色| 午夜久久久久久久久久一区二区| 亚洲成色777777女色窝| 欧美精品1区2区| 夜夜夜久久久| 久久久www成人免费精品| 亚洲国产精品毛片| 欧美午夜www高清视频| 亚洲国产综合视频在线观看| 欧美一级专区免费大片| 一区二区三区在线免费播放| 欧美好骚综合网| 亚洲欧美激情精品一区二区| 久久在线免费观看视频| 日韩午夜视频在线观看| 欧美精品999| 久久夜色撩人精品| 亚洲一区二区三区777| 欧美国产日韩一区二区| 性色一区二区| 日韩手机在线导航| 激情六月婷婷久久|