...
| 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);
}
}
}
|
...