concurrent colleagues.
I need to be able to trap an exception that might be thrown from a background thread.
Let the code speak for itself (it is a bad code)
public delegate bool CheckForUpdatesHandler(Uri uri);
public class UpdatesChecker {
public event AsyncCompletedEventHandler CheckForUpdatesAsyncCompleted;
protected virtual void OnCheckForUpdatesAsyncCompleted(AsyncCompletedEventArgs args) {
if (CheckForUpdatesAsyncCompleted != null)
CheckForUpdatesAsyncCompleted(this, args);
}
public bool CheckForUpdates(Uri ftp) {
Thread.Sleep(1000);
throw new Exception("bla");
return true;
}
public void CheckForUpdatesAsync(Uri ftp){
var action = new CheckForUpdatesHandler(CheckForUpdates);
var c=action.BeginInvoke(ftp, delegate(IAsyncResult state) {
OnCheckForUpdatesAsyncCompleted(new AsyncCompletedEventArgs(null, false, null));
}, null);
}
}
Exception handling in Thread : By default run() method doesn't throw any exception, so all checked exceptions inside the run method has to be caught and handled there only and for runtime exceptions we can use UncaughtExceptionHandler.
Uncaught exception handler will be used to demonstrate the use of exception with thread. It is a specific interface provided by Java to handle exception in the thread run method. There are two methods to create a thread: Extend the thread Class (java.
All uncaught exceptions are handled by code outside of the run() method before the thread terminates. The default exception handler is a Java method; it can be overridden. This means that it is possible for a program to write a new default exception handler.
There does not exist a way in Java to use try/catch around your start() method to catch the exceptions thrown from a secondary thread and remain multithreaded.
With Delegate.BeginInvoke, the exception will be retrieved by calling .EndInvoke - which you must do anyway to prevent a leak.
With BackgroundWorker, it will appear on the completion event
On a vanilla Thread
, an unhandled exception will tear down the process.
However, the simplest approach is: don't let it throw...
public bool CheckForUpdates(Uri ftp) {
try {
Thread.Sleep(1000);
throw new Exception("bla");
return true;
} catch (Exception ex) {
// raise an event, call a method/callback, do something
}
}
If you currently aren't using EndInvoke
, then perhaps switch to the above pattern and just use ThreadPool
directly (rather than Delegate.BeginInvoke
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With