// // Sample test program for testing Lispian error recovery model. // import std.file; import std.stdio; import std.string; import recover; class RestartOpenFile : RecoveryStrategy { string filename; this(string new_filename) { super("Restart by policy"); filename = new_filename; } } class FileNotFoundCond : Condition { string filename; this(string _filename) { filename = _filename; } auto restart(string new_filename) { return new RestartOpenFile(new_filename); } } // This is a proof-of-concept hack. In a real implementation, we'd want // std.File to call raiseCondition upon encountering an error. File osOpenFile(string filename) { if (!filename.exists) raiseCondition(new FileNotFoundCond(filename)); return File(filename); } File openDataFile(string filename) { do { retry: try { return osOpenFile(filename); } catch(RestartOpenFile r) { filename = r.filename; goto retry; } } while (false); assert(false); } int main(string[] args) { if (args.length <= 1) { writeln("Please specify data file"); return 1; } registerPolicy( delegate(FileNotFoundCond c) { writefln("File '%s' not found; please specify another " "file (Enter to abort):", c.filename); string newname = readln().chomp(); RecoveryStrategy rs; if (newname.length > 0) rs = c.restart(newname); else rs = c.abort(); return rs; } ); try { auto f = openDataFile(args[1]); scope(exit) f.close(); writeln("File contents:"); foreach (line; f.byLine()) { writeln(line); } } catch(Exception e) { writeln(e); return 1; } return 0; }