Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Exception Handling in an Event-Driven System Jan Ploski Business Information Management OFFIS Institute for Information Technology 26121 Oldenburg, Germany jan.ploski@offis.de Abstract Exception handling mechanisms were invented in 1970s to support structured programming methods for hierarchically organised software systems. The need to increase reusability and flexibility led to the development of new programming paradigms that do not emphasise hierarchical design. Event-driven systems—in which objects communicate using notifications about changed states—are a prime example. Unfortunately, this style of communication makes exception handling more difficult than in hierarchical systems. We contribute an analysis of the factors which influence exception handling in event-driven systems. The main focus of our discussion lies on the challenge of appropriate exception propagation. We provide results from an empirical case study performed on the source code of the Eclipse IDE that support our analysis. Wilhelm Hasselbring Software Engineering Group University of Oldenburg 26111 Oldenburg, Germany hasselbring@informatik.uni-oldenburg.de to a method’s invoker, does not apply to event-driven systems. The data collected in the case study serves to support our analysis. When considered separately, our results speak against an event-driven architecture. If such an architecture is preferred for other reasons, developers must take into account that the language mechanisms will likely be insufficient for exception handling and devote special attention to language-neutral alternatives. In Section 2 we discuss how early work on exception handling relates to structured programming and why current exception handling mechanisms are appropriate for hierarchically structured software. Section 3 presents a rationale for event-driven systems, in which objects react to new information rather than to commands issued by other objects. We provide several examples showing that this style of communication is independent from the issues of concurrency. In Section 4 we focus on the exception propagation from event handlers. Section 5 contains results of our empirical study. We present our results in Section 6 and conclude with a discussion of related work. 1. Introduction 2. The origins of exception handling When exception handling mechanisms were introduced into programming languages in 1970s software systems were often designed and implemented from scratch according to the principles of structured programming. Today, system builders are much more concerned with integrating the available pre-built components and installed products. Event-driven systems are a popular method of software integration. Unlike software architectures, exception handling mechanisms offered by mainstream programming languages have not changed much since 1970s. Additionally, there are few rules for discerning between the “good” and “bad” practices of exception handling with respect to software architecture and empirical evaluation is rarely attempted by researchers. In this paper we observe that the traditional approach to exception handling, which relies on exception propagation Exception handling was first proposed as a syntactic extension to languages which supported structured programming. Unsurprisingly, exception handling mechanisms are strongly related to structured programming. We wish to stress that some design assumptions in exception handling mechanisms do not fit the features of modern event-driven systems. We first explain why they are correct with respect to the original target systems. 2.1. Structured programming Structured programming is concerned with decomposing software systems into modules and defining desirable relationships among these modules. A module consists of (optional) storage space along with operations which present an abstraction of the managed Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 state to its clients. In that respect, a traditional structured programming module resembles an object. Only a single instance of a module exists in the system at run-time. Hence, modules can be thought of as singleton classes [7]. The services provided by a module are either computations or input/output operations on hardware. Structured programming recommends dividing the knowledge captured in a software system into modules to increase the locality of anticipated implementation changes. Local changes are easier to incorporate and less error-prone. Operations provided by modules should be organised in a strict hierarchy defined by their “use” relationships, with higher-level operations invoking lower-level ones [17]. Higher-level operations also need to be protected from “knowing” the secrets about data structures and algorithms encapsulated by modules enclosing the lower-level operations. Again, the reason is to constrain the effects of a system’s modification (information hiding, cf. [16]). Moreover, the lower-level operations should be kept unaware of their clients to foster reuse. Overall, structured programming improves software maintenance by making changes easier to manage and developer responsibilities easier to assign. 2.2. Structured exception handling Structured programming did not originally include language support for run-time error handling. Language designers soon recognised this omission and invented the mechanisms that shape our present way of thinking about exception handling. For example, Goodenough’s work [8] laid foundations for control flow constructs present in modern languages. A less referenced, yet equally insightful publication from the same period is by Parnas and Würges [18]. Rather than focus on syntax, the authors point out the potential goal conflicts between information hiding and exception handling. These conflicts have become increasingly relevant with the adoption of methods such as event-driven programming. Parnas and Würges observe that even verifiably correct programs have to account for “undesired events” (which we now call “exceptions”). Examples are bugs, hardware failures, but also inconsistent data inputs, beyond the system’s control. Some exceptions can be anticipated during design. However, many are only revealed during the initial period of software use. Therefore, it is practical to design software flexibly enough to introduce exception handlers later, after we have learned about the most common or critical faults. Importantly, while we need to design programs to enable exception handling, we do not need (and perhaps even cannot) implement the recovery algorithms early. First, anticipating faults is difficult. Second, overeager error handling encumbers software reuse. Specific recovery algo- rithms hard-wired into modules represent strong assumptions about their clients. To improve reuse, structured programming avoids such assumptions. Therefore, the exception handling technique proposed by Parnas and Würges supports deferral of exception handling decisions, but encourages early and preferably automated detection of errors. The choice of where to delegate the exception handling responsibility is obvious in structured programming: as a consequence of hierarchical design, the higher-level operations maintain more information about the execution context. This fact makes them likely candidates for performing recovery or diagnostic reporting. For example, a high level program may “know” whether it is run in interactive mode with a human user capable of reacting to console error messages or in batch mode where logging or automatic retry might be preferable. In short, hierarchical systems support exception handling by escalation of problem information in the hierarchy. 2.3. Exception handling vs. information hiding Parnas and Würges [18] explain the implicit limitations of exception handling concepts based on their ties to structured programming. They recognise that the possibility of exceptions clashes with the goals of information hiding: “Unless we abandon the idea of abstraction completely, no design always presents all of the information usable for recovery”. Propagating an exception upwards the call chain in a lower level operation’s execution may leave the enclosing module in an unspecified state. However, the client can only rely on specified states of the used module. As a remedy, Parnas and Würges recommend making the module’s interface more granular. It should always be detailed enough to support reasoning about potential run-time problems. Consequently, some states that could remain hidden if no exceptions were possible may need to be exposed for the sake of enabling recovery. A similar approach can be found again in Cristian’s later formalisation of exception handling in sequential programs [5]. However, Cristian treats exceptions as extensions to specifications of individual operations. He does not reflect on module-scope design issues. The difference is subtle, yet important. We shall return to it when discussing the results of our case study (Section 6). Information hiding and recovery requirements conflict even more visibly in object-oriented systems [14]. These systems are more dynamic and apply abstraction on a greater scale than traditional structured programming. In structured systems, the correspondence between the implementation of a module and its specification can be checked statically at compile time. Object-orientation encourages compile-time implementation independence through late binding. An object’s response to a received message depends on the object’s run-time type, which is set earlier in Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 the control flow. Late binding is a welcome feature, as it allows great flexibility in replacing and reconfiguring parts of an object-oriented system. Unfortunately, the traditional proposition that to enable recovery, the granularity of a module (or class) interface should reflect all possible run-time exceptions becomes less plausible. Underspecification and overspecification of possible exceptions are common in real systems. The former may lead to disastrous results when an unexpected exception occurs at run-time. The latter tends to increase careless handling of exceptions that in reality never occur in a particular system configuration. It makes software more expensive to develop and less robust by diluting attention devoted to exception handlers and their testing [11, 6]. 3. Event-driven systems The popularity of object-oriented programming led to the development of systems that are no longer strictly hierarchical. Message passing, a core concept in objectorientation, does not demand hierarchical “use” relationships among objects. Low coupling can be achieved by considering at least some objects as highly autonomous entities capable of reacting to notifications about changes in their environment and broadcasting such notifications to indicate their computational progress. Systems based on the concept of a control flow hierarchy require their replaceable parts to fit predefined utility criteria. For example, a module’s interface describes its role in the system based on its offered abstract operations. In event-driven systems, on the other hand, the focus lies on specifying communication protocols. The exact purpose of each communicating part remains unknown until late implementation or deployment. This feature is particularly advantageous in environments where only a small subset of requirements can be captured initially. Some examples include • object-oriented frameworks, whose success depends on their ability to become customised for particular usage contexts and to accept third-party contributions, • enterprise information systems, in which business requirements may change frequently after the initial release and which must integrate with pre-existing legacy software, • inter-organisational systems, which have to be administered and extended decentrally due to the constrained availability of processed (business-critical) information. Apart from the improved extensibility, event-driven systems may also offer better scalability than their hierarchically designed counterparts. For example, empirical research demonstrates that event-driven transaction processing systems better support graceful degradation under heavy load [23]. We next describe sample architectures of event-driven systems to emphasise that the general concept of objects acting upon availability of information rather than upon commands may be implemented in multiple ways. Specifically, a notifier can deliver events either synchronously or asynchronously. In our opinion, it is important to generalise from the implementation details to notice that the issues with exception handling are not caused by the limitations of a particular programming language. 3.1. Synchronous event delivery in graphical user interfaces In synchronous event delivery the notifier blocks execution until the dispatched notification for an event is processed by all interested parties. Notifications are dispatched sequentially; the control flow is transferred to each of the recipients in turn and finally returns to the notifier. To provide an example of synchronous event delivery, we describe the Model-View-Controller (MVC) pattern [4] in desktop GUI programming. We frequently encountered this pattern in our empirical study. The MVC pattern specialises the more general Observer [7] design pattern and is found in most GUI frameworks. Two sources of events exist in GUI programming: • user actions, such as key strokes or mouse movements, and • application-generated events, such as requests to repaint a screen region. Typically, a GUI framework translates primitive input events into semantically richer events, such as selection changes, enablement/disablement of widgets, button presses, scroll bar movements, and many more. The processing of these events is, in turn, application-specific. Events are delivered synchronously. It is natural given a single interacting user with a single set of input/output devices. Events created by the windowing system and those created by an application are dispatched and processed in the same execution thread. Therefore, an application must handle them without delay and delegate any long-running operations to another thread. Furthermore, the MVC pattern encourages application programmers to define their own event types based on the needs of an application. Classes in the model role represent data objects and dispatch notifications to controller classes whenever a change occurs in the data. A controller reacts to such notifications by updating one or more view objects. Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 Moreover, it processes notifications about user actions reported by the view. It possibly reacts to such actions by modifying data in the model. A developer who uses the MVC pattern can easily exchange views while keeping the same model or manipulate the model directly and rely on notifications to keep a group of views synchronised. Events are thus used to maintain desired state invariants across a system without sacrificing extensibility. 3.2. Asynchronous event delivery in enterprise information systems Asynchronous event delivery means that an event source may proceed with execution immediately after dispatching an event without waiting for the completion of its processing. Asynchronous schemes are supported by multithreading and explicit event queues. Implementations often also support event persistence, routing and prioritisation. Exemplarily, we consider an enterprise message bus implemented using Java Message Service [10] and its relationship to service-oriented architectures (SOA). SOA are a modern approach to structuring enterprise applications based on the following principles: • isolate business functions from execution contexts, • publish information about these functions using directory services, and • provide access with standardised, implementationneutral protocols. The main benefit of adhering to SOA is the ability to quickly compose enterprise information systems (EIS) of fine-grained building blocks of business logic. It is an attractive alternative to the integration of earlier, shrinkwrapped, coarse-grained products of ERP software vendors. Basic SOA focuses on decomposition of applications into services usable according to a request/response model. However, more advanced SOA concepts provide for eventbased communication among services. They promise easier integration of disparate (and distributed) legacy systems, better performance (when compared to polling), traceability, and load balancing. Meanwhile, production-quality open source messaging frameworks are available that support event-driven programming in the EIS context [9]. Ongoing standardisation activities (e.g., WS-Notification [15]) also confirm its broad relevance. The Java Message Service [10] is a vendor-specific standard by Sun Microsystems related to event-driven architectures. It specifies a programming interface for server-side Java applications which allows creating, sending, receiving and reading messages. Implementations with functionality dictated by JMS are provided by various vendors of enterprise middleware. JMS provides two models for sending messages (including event notifications): the point-to-point model and the publish/subscribe model. The former requires the JMS client to address a message to a specific queue available in the system. The latter allows to establish a named communication channel used concurrently by multiple senders and receivers. In both cases asynchronous message delivery may be supported by a JMS implementation. Sending of messages is asynchronous by default, but synchronous invocations can be emulated by explicitly waiting for a reply after a message is sent. 4. Exception propagation during event handling An exception which occurs in a hierarchically structured system in response to a requested operation is naturally propagated to the operation’s invoker (Section 2.2). This is not true for exceptions raised during event processing in an event-driven system. Apart from implementation difficulties, such as the possible lack of a back-reference from an event handler to an event issuer, more general problems emerge. We noted earlier that the flexibility of an event-driven system comes from decoupling the event producers and consumers. However, the premise of any exception propagation is that the recipient of a forwarded exception can better decide about the required actions than the forwarder. No general argument can be made in favour of propagating an exception from an event handler to its issuer. Unfortunately, this is the only kind of propagation supported by mainstream programming languages. Existing advice available to developers of event-driven systems concerns whether or not to propagate exceptions from event handlers to their invokers. Two basic approaches exist, which we discuss in context of the Observer pattern. The notified objects must provide a no-throw guarantee [22]. Alternatively, they may only supply limited failure information by throwing some generic exception. 4.1. Providing a no-throw guarantee The implementor of a notifier may decide that the notified objects must not throw any exceptions. This approach appears attractive as it frees her from any exception handling responsibilities. However, it requires that the full information necessary for exception handling be available to the notified object. It also assumes that any constraints on the behaviour of the notified object do allow appropriate exception handling. While the first requirement is selfevident, the latter needs further elaboration. As an example, consider the notification mechanism in event-driven GUI programming explained in Section 3.1. Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 An application programmer provides concrete implementations of event handlers specified by the framework. To maintain a responsive GUI, event handlers must satisfy soft real-time constraints during their execution. Moreover, because of the sequential nature of event handling, they must not rely on any service provided by other event handlers. Such constraints make it impossible to report an exception to the user through the GUI or to directly solicit user input in an event handler. To work around the problem while still maintaining the no-throw guarantee, we must handle exceptions asynchronously. That is, we delegate the processing of exceptions to another thread and postpone it until the remaining registered event handlers have seen the current event. In short, we must use custom propagation. However, the basic no-throw approach does not include any provisions nor recommendations about such alternative propagation, and it is not syntactically supported by the programming language. The necessity to deal with custom propagation partly defeats the point for using exceptions, as we no longer have a uniform, explicit way of dealing with run-time errors. ity of assessing exception handling’s quality using source code inspections. We chose an exploratory case study as the preferred research method for several reasons. First, the described propagation rules are heuristics and thus inherently difficult to evaluate analytically. Second, participants of real software development projects have to rely on similar heuristics for making exception handling decisions. Third, there is no accepted theory which would define the attributes of “good” exception handling. Due to the lack of established quality metrics, we did not attempt to formulate statistically testable hypotheses. We describe our surrogate metrics in Section 5.4. 5.1. Research questions Our case study focused on a single system which we qualified as event-driven based on prior experience (see below). We posed the following research questions about the examined system: • What is the incidence of event-based communication in comparison to the usual imperative control flow constructs? 4.2. Propagation to the invoker If the requirement of a no-throw guarantee turns out difficult to satisfy in practice, we might hope that the second approach, propagating a generic exception to the notifier, has better prospects. Alas, this is not true. Consider a scenario in which a component manages data stored in a database shared with other components. The components are unaware of each other and coordinated by an implementation framework. When a component updates the shared database, the remaining components are notified by the framework. They react by executing componentspecific code, in which an internal exception might occur. In this case, the exception is propagated to the framework, which in turn propagates it to the component responsible for the update. While this approach seems reasonable at first, the updating component is, by design, unable to handle any exception originating from another (notified) component. In fact, the reason for such an exception might not at all be related to the update event. Obviously, exception propagation to the notifier (the framework) and consequently to the event originator (the updater) is undesirable. 5. Case study (Eclipse IDE) We performed an empirical study to evaluate claims about the relationship of event-driven communication and exception handling made in the preceding section and in [19]. A secondary goal of the study was to test the feasibil- • Does event-based communication affect exception handling? • What happens with exceptions that occur during the processing of event notifications? In particular, what propagation paths are selected for such exceptions? 5.2. Context We studied the source code of the Eclipse SDK [1], version 3.1.1. We have been using this open source Java programming environment for more than 3 years. We also implemented custom extensions (plug-ins) during that time, resulting in a familiarity with the code base and tools necessary to perform the analysis. Another reason for analysing Eclipse was its representative character: a non-trivial desktop application with a graphical user interface. Finally, we decided that it qualified as an event-driven system because its flexibility relies on indirect communication among independently contributed extensions. 5.3. Setup and execution Our analysis covered contents of all Java packages from the standard distribution of Eclipse SDK, version 3.1.1, whose names begin with org.eclipse. These packages comprise the Eclipse workbench, a general platform for implementing programming tools, as well as the Java IDE Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 Entity Listeners Types Listener classes Event handlers Event handlers with try/catch Found 227 11839 2368 3644 106 5.4. Classification scheme We analysed each of the 50 handlers to obtain answers to the following tests from our classification scheme (Table 2): Table 1. Summary of data processed in the case study, showing counts of entities found by our search algorithm. Listeners are Java interfaces containing one or more event handlers. Types are all classes and interfaces over which the search was performed. Listener classes are implementations of the listeners. Event handlers are individual methods specified in listeners. The last row contains exception-sensitive event handlers. functionality implemented by the Java Development Tools subproject. We used a customised version of Eclipse’s own syntactic search feature to locate a subset of all methods that qualify as exception-sensitive event handlers (Table 1). Our search relied on a standard Java naming convention for applying the Observer pattern. We searched for implementations of all methods declared in Java interfaces with the name suffix Listener. From all identified event handlers, we selected for further evaluation only those that contained a try/catch block in their source text. This filtering step may have eliminated some of the potentially interesting cases. Concerned are those cases in which exception handling (or non-standard propagation) are embedded deeper in the call chain than in the event handler’s text itself. A more precise method would require static analysis [6] of such call chains. However, even then the results would have been limited by Eclipse’s extensive use of Java interfaces. After the filtering steps, we analysed the handlers individually by studying their source code. We reflected upon similarities and differences in exception handling, and incorporated them into an incrementally developed classification scheme (Table 2). After the first pass, we returned to handlers examined earlier in order to apply to them all classification criteria that were added during this pass. We analysed approximately one half of all qualifying event handlers. However, we observed that the set of classification criteria ceased to grow early during this analysis. We therefore assume that the examination of remaining handlers would contribute little to the qualitative results. Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 Evaluated criteria Event handler name GUI event? Print? Log? Report via GUI? Discard? Handle impossible? Evaluate exception object? Handle non-exceptions? Sample values package.method No No Yes No No Yes No No 50 10 0 31 8 5 19 0 7 Table 2. Our classification scheme for exception-sensitive event handlers (see Section 5.4). The left column contains criteria analysed for each handler, the middle column some sample values, the right column the number of handlers which positively passed each test in our study. 1. Is the handled event a GUI event? We wanted to estimate how much of the event-based communication is triggered by the GUI framework. 2. Is the exception handling limited to writing a stack trace? This question served to assess the maturity level of the analysed code. 3. Does the exception handling consist of logging? 4. Does the exception handling consist of displaying an error dialog or otherwise indicating that the displayed result is wrong? 5. Are possible exceptions discarded? We found out whether an exception could actually occur by code inspection, then checked for empty catch blocks. 6. Are impossible exceptions caught? The opposite of the previous test, it concrened non-empty catch blocks for exceptions that could never occur. We only concluded that an exception could not occur when the invoked implementation did not throw it and was under control of the event handler’s author. 7. Does the exception handling alter control flow based on the contents of an exception? Examples would be providing a degraded level of service or undertaking fault removal. 8. Are “harmless” exceptions (non-exceptions) handled? Some event handlers deal with exceptions that are not caused by error, but serve to implement required functionality. For example, Java’s standard method for checking whether a string represents an integer value throws an exception. 5.5. Additional analysis Apart from the above described classification, we performed a more thorough code inspection in several cases to evaluate how exception handling could be improved. We were especially interested in finding out whether exceptions identify faults (causes of errors [2]) and carry information relevant for recovery. Finally, we investigated whether a degraded level of service could be offered after the exception’s occurrence. 6. Conclusions Confirming our expectations, Eclipse employs a substantial amount of event-based communication. Roughly every fifth class contains an implementation of one or more event handlers (Table 1). A minority of the examined event handlers (10 of 50) process GUI events. Notification mechanisms are thus not used due to the programming style imposed by the windowing toolkit (SWT), but rather as a general method of maintaining consistency across system components. We were surprised by the number of cases in which impossible exceptions were handled (19 of 50 analysed event handlers). On the one hand, this observation means that we had overestimated the incidence of exception handling during notifications. On the other hand, the numerous cases in which impossible exceptions are caught and logged without comments suggest that exception handling had not been considered in detail by developers. We found 7 cases in which exceptions did not indicate a run-time error. They were either used instead of normal return values or were specified in catch blocks, but could not in fact occur and were safely ignored. Consequently, only a half (24) of the analysed exception-sensitive event handlers dealt with genuine exceptions. The prevalent way of handling exceptions was logging them and continuing execution. The event handlers thus provided a no-throw guarantee to their invokers (cf. Section 4.1). The logged messages typically consisted of a context description in natural language together with other textual information carried by the exception object. The latter information was produced at throw sites rather than collected during propagation. Eclipse’s developers had made liberal use of mapping low level exceptions to higher level ones. This approach is often advocated in the literature [3, 12, 20]. From the viewpoint of understanding exception handling, we consider it a poor alternative to the solution proposed by Parnas (see Section 2.3). Catch blocks examined in our study referred to very abstract exceptions (e.g., the CoreException, “a checked exception representing a failure”). High level exceptions carried integer status codes to describe the underlying faults. A possible reason for introducing such (documented) status codes was to limit the overall number of exception classes. However, in consequence we could not determine the relevant faults simply by simply examining method signatures. In many cases, method documentation described these faults, with varying levels of accuracy. Although the error codes were recorded at throw sites, we found no single case of their evaluation in catch blocks. This is not surprising because subclasses of caught exception types can add their own status codes. However, an invoker cannot assume anything about the existence of such subclasses. The most important result of the study is that a system’s design—including its hierarchy of exceptions and their processing during propagation—severely impacts the later possibilities for the analysis and improvement of exception handling. The study demonstrates that exception handling in our system fulfils the role of reporting and propagation of failure and contributes little to explaining and removing faults or to maintaining an acceptable level of service under unusual conditions. Exception handling mechanisms offered by modern object-oriented programming languages do not help to solve this problem, which is related to system design, not to implementation. 7. Related work Past research focused on support for the evolution of exceptional specifications in object-oriented software development [13]. However, it seems unlikely that providing type-safe ways to alter method specifications can solve the overall exception-related problem of interface and implementation mismatch. The argument provided by Parnas [18] demonstrates that exceptions may induce a complete redesign of a module’s interface. Our empirical study provides evidence that this argument is not followed in practice. We speculate that the need for extensibility outweighs concerns related to exception handling. Other researchers have criticised deficiencies of mainstream exception handling approaches for specific classes of systems. For example, Romanovsky and Kienzle treat concurrent systems [21]. Our work differs in two aspects: the type of examined systems and the research approach. Romanovsky and Kienzle postulate an appropriate system structuring for satisfactory exception handling. In contrast, we point out that architectural decisions may be dominated Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007 by factors not related to reliability, such as extensibility and the availability of tools. Howell and Vecellio [11] identify patterns of inappropriate exception handling based on an analysis of a range of critical systems. Our work is similar to theirs in the approach of deriving practical advice based on the empirical evaluation of existing systems. We are aware that the amount of support for handling and analysing exceptions present in a system is a design decision—one of the many that need to be made during software development. We observed that exception handling in our case study was reduced to the reporting of run-time errors. Assuming that it is a common practice in other systems, a question remains: is it bad? Such questions can be satisfactorily answered only by taking into consideration the requirements and criticality of each system. While there is little hope for development of absolute metrics for the quality of exception handling, there is much to be learnt in the process. References [1] Eclipse SDK, version 3.1.1 (http://www.eclipse. org), retrieved 2005-12-17. [2] A. Avižienis, J.-C. Laprie, B. Randell, and C. E. Landwehr. Basic concepts and taxonomy of dependable and secure computing. IEEE Trans. Dependable Sec. Comput., 1(1):11–33, 2004. [3] J. Bloch. Effective Java Programming Language Guide. Addison-Wesley Professional, 1st edition, June 2001. [4] F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, and M. S. and. Pattern-Oriented Software Architecture: A System of Patterns, volume 1. John Wiley & Sons, 1st edition, August 1996. [5] F. Cristian. Exception handling and tolerance of software faults. In M. R. Lyu, editor, Software Fault Tolerance, pages 81–108. John Wiley & Sons Ltd., 1995. [6] C. Fu, A. Milanova, B. G. Ryder, and D. G. Wonnacott. Robustness testing of Java server applications. IEEE Trans. Softw. Eng., 31(4):292–311, 2005. [7] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, Massachusetts, 1995. [8] J. B. Goodenough. Exception handling: issues and a proposed notation. Commun. ACM, 18(12):683–696, 1975. [9] J. Hanson. Event-driven services in SOA. JavaWorld, http://www.javaworld.com/javaworld/ jw-01-2005/jw-0131-soa.html, January 2005. [10] M. Hapner, R. Burridge, R. Sharma, J. Fialli, and K. Stout. Java Message Service. http://java.sun. com/products/jms/docs.html, April 2002. [11] C. Howell and G. Vecellio. Experiences with error handling in critical systems. In A. Romanovsky, C. Dony, J. L. Knudsen, and A. Tripathi, editors, Advances in exception handling techniques, volume 2022 of LNCS, pages 181– 188, New York, NY, USA, 2001. Springer-Verlag New York, Inc. [12] J. D. Litke. A systematic approach for implementing fault tolerant software designs in ada. In TRI-Ada ’90: Proceedings of the conference on TRI-ADA ’90, pages 403– 408, New York, NY, USA, 1990. ACM Press. [13] A. Mikhailova and A. Romanovsky. Supporting evolution of interface exceptions. In A. Romanovsky, C. Dony, J. L. Knudsen, and A. Tripathi, editors, Advances in exception handling techniques, volume 2022 of LNCS, pages 94–110, New York, NY, USA, 2001. Springer-Verlag New York, Inc. [14] R. Miller and A. Tripathi. Issues with exception handling in object-oriented systems. In M. Aksit and S. Matsuoka, editors, ECOOP ’97 - Object-Oriented Programming. Proceedings of the 11th European Conference, volume 1241 of LNCS, pages 85–103. Springer-Verlag New York, Inc., 1997. [15] P. Niblett and S. Graham. Events and service-oriented architecture: The OASIS web services notification specifications. IBM Systems Journal, 44(4):869–886, 2005. [16] D. L. Parnas. Information distribution aspects of design methodology. In IFIP Congress (1), pages 339–344, 1971. [17] D. L. Parnas. Designing software for ease of extension and contraction. In ICSE ’78: Proceedings of the 3rd international conference on Software engineering, pages 264–277, Piscataway, NJ, USA, 1978. IEEE Press. [18] D. L. Parnas and H. Würges. Response to undesired events in software systems. In ICSE ’76: Proceedings of the 2nd international conference on software engineering, pages 437–446, Los Alamitos, CA, USA, 1976. IEEE Computer Society Press. [19] J. Ploski and W. Hasselbring. The callback problem in exception handling. In A. Romanovsky, C. Dony, J. L. Knudsen, and A. Tripathi, editors, Developing Systems that Handle Exceptions. Proceedings of ECOOP’05 Workshop on Exception Handling in Object-Oriented Systems, pages 39–62. Department of Computer Science, LIRMM, University of Montpellier II, France, July 2005. [20] M. P. Robillard and G. C. Murphy. Designing robust Java programs with exceptions. In SIGSOFT ’00/FSE-8: Proceedings of the 8th ACM SIGSOFT international symposium on foundations of software engineering, pages 2–10, New York, NY, USA, 2000. ACM Press. [21] A. Romanovsky and J. Kienzle. Action-oriented exception handling in cooperative and competitive concurrent object-oriented systems. In A. Romanovsky, C. Dony, J. L. Knudsen, and A. Tripathi, editors, Advances in exception handling techniques, volume 2022 of LNCS, pages 147– 164, New York, NY, USA, 2001. Springer-Verlag New York, Inc. [22] B. Stroustrup. Exception safety: concepts and techniques. In A. Romanovsky, C. Dony, J. L. Knudsen, and A. Tripathi, editors, Advances in exception handling techniques, volume 2022 of LNCS, pages 60–76, New York, NY, USA, 2001. Springer-Verlag New York, Inc. [23] M. D. Welsh. An Architecture for Highly Concurrent,Well-Conditioned Internet Services. PhD thesis, University of California, Berkeley, CA, USA, Fall 2002. Second International Conference on Availability, Reliability and Security (ARES'07) 0-7695-2775-2/07 $20.00 © 2007