...
Code Block | ||
---|---|---|
| ||
public class ExceptionLog implements Runnable { public void logMessage(String message) { FileOutputStream fo = null; FileLock lock = null; try { // This can throw an exception and prevent logging. fo = new FileOutputStream("log_file.txt", true); // Lock the file so only one thread can write a log message at a time. lock = fo.getChannel().lock(); // Output the log message. System.err.println(message); fo.write((message + "\nRuntime.getProperty("line.separator").getBytes()); } // If an exception is caught, the original log message is lost catch (FileNotFoundException e){ logMessage("File Not Found Exception."); } catch (IOException e) { logMessage("IO Exception."); } catch (OverlappingFileLockException e) { logMessage("Cannot access file."); } finally { // Clean up by releasing the file lock and closing the file. try { if (lock != null) { lock.release(); } if (fo != null) { fo.close(); } } catch (IOException e) { // This is unexpected. throw new RuntimeException(e); } } } public void run() { try { // Some security exception occurs here. } catch (SecurityException se) { logMessage("Security Exception has occurred!"); } } public static void main(String[] args) { // Start multiple threads logging messages. for (int x = 1; x <= 20; x++) { (new Thread(new ExceptionLog())).start(); } } } |
...
Code Block | ||
---|---|---|
| ||
public class ExceptionLog implements Runnable {
Logger logger;
Integer id;
public ExceptionLog(Integer i, Logger log) {
logger = log;
id = i;
}
public void logMessage(String message) {
// Note that the Java Logger class does not throw exceptions
// while logging a message.
logger.log(Level.WARNING, "From " + id + ": " + message);
}
public void run() {
try {
// Some security exception occurs here.
} catch (SecurityException se) {
logMessage("Security Exception has occurred!");
}
}
public static void main(String[] args) {
try {
// Set up the shared logger for use by the multiple threads
Logger logger = Logger.getLogger("MyLog");
FileHandler fh = new FileHandler("log_file.txt", true);
logger.addHandler(fh);
logger.setLevel(Level.ALL);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
// Start multiple threads for logging messages
for (int x = 1; x <= 20; x++) {
(new Thread(new ExceptionLog(x, logger))).start();
}
} catch (SecurityException e) {
// This is unexpected.
throw new RuntimeException(e);
} catch (IOException e) {
// This is unexpected.
throw new RuntimeException(e);
}
}
}
|
...