From: Bard B. <ba...@us...> - 2012-06-08 21:08:00
|
Here's a little X10 puzzle. I've got a *Java* method I need to call from X10: table.get(get); This method can throw java.io.IOException, so I have to wrap calls to it in a try/catch block. If I don't, I get Java compilation errors: x10c: ---------- 1. ERROR in clsss/xjj/HTabler.java (at line 474) thingTable.get(((org.apache.hadoop.hbase.client.Get)(this. get))); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Unhandled exception type IOException ---------- 1 problem (1 error) x10c: Non-zero return code: 255 So I have to put a try/catch around it: try { return thingTable.get(get); } catch(e:x10.lang.Exception) { e.printStackTrace(); throw new RuntimeException("Oh no from HTabler.retrieveThingRecord! " + e); } And that compiles fine. (I'm a bit confused about why, since I didn't think java.io.IOException was consistent with x10.lang.Exception.) But what I really want to do is write a method that behaves like various things named 'with' in LISP and Python and such. public static def withThingTable[T]( body : (HTableInterface) => T ) {T haszero} : T So that withThingTable(useThingTable) will call the function useThingTable on a properly-opened Thing Table, and, after it's done (even exceptionally) will properly close it. withThingTable is pretty careful with catching exceptions, so it should run OK. It's a convenience method, encapsulating a required programming pattern. The point of a convenience method is that it be convenient. I *want* to write: return withThingTable( (tt:HTableInterface) => tt.get(get) ) But X10 and Java don't know that I'm being careful with exceptions. So I have to write the try/catch block inside the closure: return withThingTable[Result]((thingTable:HTableInterface) => { try { return thingTable.get(get); } catch(e:x10.lang.Exception) { e.printStackTrace(); throw new RuntimeException("Oh no from HTabler.retrieveThingRecord! " + e); } }); And this makes my convenience method not so convenient. Any suggestions about how I could avoid having to write the try/catch block in the closure? Preferably without having to write my own 'get' (and all N other HBase methods)? Thanks, Bard |
From: Mikio T. <mik...@gm...> - 2012-06-18 14:56:25
|
Hi, To catch java.io.IOException, catch(x10.lang.Exception) is not enough. Java backend actually generates catch (java.lang.Throwable). If java.io.IOException occur, it is wrapped with UnknownJavaThrowable and rethrown. Since UnknownJavaThrowable is subtype of java.lang.RuntimeException, it actually compiles but you cannot catch java.io.IOException. The problem you mentioned here is same as XTENLANG-2989 and XTENLANG-3062. Many people have been complaining about it, but it has not been solved yet. As a workaround, what about writing a simple utility function which takes a closure, then evaluates the closure and returns its return value within a try to ignore all Java exceptions? e.g., return withThingTable( (tt:HTableInterface) => ExceptionUtil.invokeIgnoringException(tt.get(get)) ) -- Mikio 2012/6/9 Bard Bloom <ba...@us...>: > Here's a little X10 puzzle. > > I've got a *Java* method I need to call from X10: > table.get(get); > This method can throw java.io.IOException, so I have to wrap calls to it in > a > try/catch block. If I don't, I get Java compilation errors: > > x10c: ---------- > 1. ERROR in clsss/xjj/HTabler.java (at line 474) > thingTable.get(((org.apache.hadoop.hbase.client.Get)(this. > get))); > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > Unhandled exception type IOException > ---------- > 1 problem (1 error) > x10c: Non-zero return code: 255 > > So I have to put a try/catch around it: > try { > return thingTable.get(get); > } > catch(e:x10.lang.Exception) { > e.printStackTrace(); > throw new RuntimeException("Oh no from > HTabler.retrieveThingRecord! " + e); > } > > And that compiles fine. (I'm a bit confused about why, since I didn't think > java.io.IOException was consistent with x10.lang.Exception.) > > But what I really want to do is write a method that behaves like various > things named 'with' in LISP and Python and such. > public static def withThingTable[T]( body : (HTableInterface) => T ) {T > haszero} : T > So that withThingTable(useThingTable) will call the function useThingTable > on > a properly-opened Thing Table, and, after it's done (even exceptionally) > will > properly close it. > > withThingTable is pretty careful with catching exceptions, so it should run > OK. It's a convenience method, encapsulating a required programming > pattern. > > The point of a convenience method is that it be convenient. I *want* to > write: > return withThingTable( (tt:HTableInterface) => tt.get(get) ) > > But X10 and Java don't know that I'm being careful with exceptions. So I > have > to write the try/catch block inside the closure: > > return withThingTable[Result]((thingTable:HTableInterface) => { > try { > return thingTable.get(get); > } > catch(e:x10.lang.Exception) { > e.printStackTrace(); > throw new RuntimeException("Oh no from > HTabler.retrieveThingRecord! " + e); > } > }); > > And this makes my convenience method not so convenient. > > Any suggestions about how I could avoid having to write the try/catch block > in > the closure? Preferably without having to write my own 'get' (and all N > other > HBase methods)? > > Thanks, > > Bard > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > X10-core mailing list > X10...@li... > https://lists.sourceforge.net/lists/listinfo/x10-core > |