...
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 + ""\n"").getBytes()); } // If an exception is caught, the original message to log 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<x<=20; x++) { (new Thread(new ExceptionLog())).start(); } } } |
...
Code Block | ||
---|---|---|
| ||
public class ExceptionLog implements Runnable { Logger logger; Integer id; public ExceptionLog(Integer i, Logger l) { logger = l; 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""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<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); } } } |
...
EXC01-J. Do not allow exceptions to transmit sensitive information 13. Exceptional Behavior (EXC) EXC03-J. Try to gracefully recover from system errors