123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- ---
- title: Handling Errors
- order: 6
- layout: page
- ---
-
- [[application.errors]]
- = Handling Errors
-
- [[application.errors.error-indicator]]
- == Error Indicator and Message
-
- All components have a built-in error indicator that is turned on if validating
- the component fails, and can be set explicitly with
- [methodname]#setComponentError()#. Usually, the error indicator is placed right
- of the component caption. The error indicator is part of the component caption,
- so its placement is usually managed by the layout in which the component is
- contained, but some components handle it themselves. Hovering the mouse pointer
- over the field displays the error message.
-
-
- [source, java]
- ----
- textfield.setComponentError(new UserError("Bad value"));
- button.setComponentError(new UserError("Bad click"));
- ----
-
- The result is shown in <<figure.application.errors.error-indicator>>.
-
- [[figure.application.errors.error-indicator]]
- .Error Indicator Active
- image::img/errorindicator-example2.png[scaledwidth=40%]
-
- [[application.errors.reconnect]]
- == Connection Fault
-
- If the connection to the server is lost, Vaadin application shows a "lost connection" notification
- and tries to restore the connection. After several retries, an error message is shown.
- You can customize the messages, timeouts, and the number of reconnect attempts in the [classname]#ReconnectDialogConfiguration#
- object, which you can access from your [classname]#UI# with [methodname]#getReconnectDialogConfiguration()#.
-
- [[application.errors.systemmessages]]
- == Customizing System Messages
-
- System messages are notifications that indicate a major invalid state that
- usually requires restarting the application. Session timeout is perhaps the most
- typical such state.
-
- System messages are strings managed in the [classname]#SystemMessages# class.
- Each message has four properties: a short caption, the actual message, a URL to
- which to redirect after displaying the message, and property indicating whether
- the notification is enabled.
-
- You can override the default system messages by setting the
- [interfacename]#SystemMessagesProvider# in the [classname]#VaadinService#. You
- need to implement the [methodname]#getSystemMessages()# method, which should
- return a [classname]#SystemMessages# object. The easiest way to customize the
- messages is to use a [classname]#CustomizedSystemMessages# object.
-
- You can set the system message provider in the
- [methodname]#servletInitialized()# method of a custom servlet class, for example
- as follows:
-
-
- [source, java]
- ----
- getService().setSystemMessagesProvider(
- new SystemMessagesProvider() {
- @Override
- public SystemMessages getSystemMessages(
- SystemMessagesInfo systemMessagesInfo) {
- CustomizedSystemMessages messages =
- new CustomizedSystemMessages();
- messages.setCommunicationErrorCaption("Comm Err");
- messages.setCommunicationErrorMessage("This is bad.");
- messages.setCommunicationErrorNotificationEnabled(true);
- messages.setCommunicationErrorURL("http://vaadin.com/");
- return messages;
- }
- });
- ----
-
- See
- <<dummy/../../../framework/application/application-lifecycle#application.lifecycle.servlet-service,"Vaadin
- Servlet, Portlet, and Service">> for information about customizing Vaadin
- servlets.
-
- [[application.errors.unchecked-exceptions]]
- == Handling Uncaught Exceptions
-
- Handling events can result in exceptions either in the application logic or in
- the framework itself, but some of them may not be caught properly by the
- application. Any such exceptions are eventually caught by the framework. It
- delegates the exceptions to the [classname]#DefaultErrorHandler#, which displays
- the error as a component error, that is, with a small red "!" -sign (depending
- on the theme). If the user hovers the mouse pointer over it, the entire
- backtrace of the exception is shown in a large tooltip box.
-
-
- You can customize the default error handling by implementing a custom
- [interfacename]#ErrorHandler# and enabling it with
- [methodname]#setErrorHandler()# in any of the components in the component
- hierarchy, including the [classname]#UI#, or in the [classname]#VaadinSession#
- object. You can either implement the [interfacename]#ErrorHandler# or extend the
- [classname]#DefaultErrorHandler#. In the following example, we modify the
- behavior of the default handler.
-
-
- [source, java]
- ----
- // Here's some code that produces an uncaught exception
- final VerticalLayout layout = new VerticalLayout();
- final Button button = new Button("Click Me!", event ->
- ((String)null).length()); // Null-pointer exception
- layout.addComponent(button);
-
- // Configure the error handler for the UI
- UI.getCurrent().setErrorHandler(new DefaultErrorHandler() {
- @Override
- public void error(com.vaadin.server.ErrorEvent event) {
- // Find the final cause
- String cause = "<b>The click failed because:</b><br/>";
- for (Throwable t = event.getThrowable(); t != null;
- t = t.getCause())
- if (t.getCause() == null) // We're at final cause
- cause += t.getClass().getName() + "<br/>";
-
- // Display the error message in a custom fashion
- layout.addComponent(new Label(cause, ContentMode.HTML));
-
- // Do the default error handling (optional)
- doDefault(event);
- }
- });
- ----
-
- The above example also demonstrates how to dig up the final cause from the cause
- stack.
-
- When extending [classname]#DefaultErrorHandler#, you can call
- [methodname]#doDefault()# as was done above to run the default error handling,
- such as set the component error for the component where the exception was
- thrown. See the source code of the implementation for more details. You can call
- [methodname]#findAbstractComponent(event)# to find the component that caused the
- error. If the error is not associated with a component, it returns null.
|