Any non-trivial application is going to have many layers. Some layers may be concerned with the details of interacting with databases, web services, files and so on. Other layers will contain business logic and still others will render the GUI or offer other services. When an exception occurs in one layer, it may be necessary to propagate that exception to another layer. Since a business logic layer won't know much about working with files/databases/sockets and we want to isolate that layer from the details, we may throw a custom exception (i.e. CustomerNotFoundException) that the business logic can understand and resolve. However, we will still want to indicate the original cause of the CustomerNotFoundException for debugging purposes, so we create the custom exception with a reference to the original. It is not unusual to get a chain of dozens of exceptions in J2EE applications because of all the layers in an application server.