[Ironruby-core] Throwing Exceptions defined in Ruby from C#

Daniele Alessandri suppakilla at gmail.com
Fri Feb 13 15:51:13 EST 2009


I will try going with this solution, thanks.

As for the reusability of the code from other applications/languages,
I think it would be something impossibile to begin with as the library
is tightly coupled with ruby (especially the generator class, it
interacts a lot with ruby code) and this is due to an intrinsic factor
of its conceptual design (which goes back to the original
implementation) and IMHO it is not really a matter of bad design
choices.


On Fri, Feb 13, 2009 at 19:34, Tomas Matousek
<Tomas.Matousek at microsoft.com> wrote:

> You can use KernelOps.RaiseException:
>
> public static void RaiseException(RespondToStorage/*!*/ respondToStorage, UnaryOpStorage/*!*/ storage0, BinaryOpStorage/*!*/ storage1,
>            RubyContext/*!*/ context, object self, object/*!*/ obj, [Optional]object arg, [Optional]RubyArray backtrace) {
>
>
> You'll need to allocate local site storages to do so. The storages are allocated automatically for methods called from Ruby.
> I assume you have some entry point to the C# part of the parser that you call from Ruby. That method should declare the storages and pass them thru to the place where you want to raise the exception.
>
> It might be easier to change your C# implementation not to throw Ruby exceptions. You can throw a C# exception, catch it in Ruby and rethrow the corresponding Ruby exception. This way your C# code would be usable from C# apps as well, not only from Ruby code.
>
> Tomas
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Shri Borde
> Sent: Friday, February 13, 2009 9:56 AM
> To: ironruby-core at rubyforge.org
> Subject: Re: [Ironruby-core] Throwing Exceptions defined in Ruby from C#
>
> I don't think your code below will work as multiple Ruby types share the same underlying CLR type. If you want to do things in a strongly-bound way, you would need to use the RubyUtils and other runtime helpers to find the method "new", invoke it, etc. instead of using System.Reflection.
>
> An alternative is to just do an eval. Something like:
>   RubyUtils.Evaluate("raise JSONError", scope)
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Daniele Alessandri
> Sent: Thursday, February 12, 2009 11:59 PM
> To: ironruby-core at rubyforge.org
> Subject: Re: [Ironruby-core] Throwing Exceptions defined in Ruby from C#
>
> Yes it is meant to be used primarily from ruby as it is a port of a
> rather widespread library, and a dependency for a bunch of other
> libraries (see http://json.rubyforge.org/).
>
> The reason is simply to maintain compatibility with the ruby bits of
> the original json library in which exceptions are defined inside a
> common.rb file: this is due to the fact that this lib comes in two
> flavours, json-pure (everything is ruby) and json-ext (the generator
> and parser are implemented in C, the rest is ruby), so there are parts
> of the code that are shared between the two and eventually invoked
> from within the native code.
>
> Anyway I'm curious, I haven't found other means to do that in a much
> cleaner way :)
>
>
> On Fri, Feb 13, 2009 at 04:33, Tomas Matousek
> <Tomas.Matousek at microsoft.com> wrote:
>> Why don't you declare the exceptions in C#? I assume the library is primarily to be used from Ruby code, not from C#, right?
>>
>> Tomas
>>
>> -----Original Message-----
>> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Daniele Alessandri
>> Sent: Thursday, February 12, 2009 6:31 AM
>> To: ironruby-core at rubyforge.org
>> Subject: [Ironruby-core] Throwing Exceptions defined in Ruby from C#
>>
>> Hi,
>>
>> I'm refactoring and polishing the source code of my port of json/ext
>> to IronRuby (it's feature complete by now) but I'm wondering if there
>> is a better way to throw an Exception defined in ruby from C# compared
>> to the only solution I've came up with so far. Here is the code I'm
>> using right now, stripped down of checks and condensed in one method
>> just for the sake of brevity:
>>
>> ----- ruby -----
>>
>> module JSON
>>    class JSONError < StandardError; end
>>    class ParserError < JSONError; end
>> end
>>
>> ----- C# -----
>>
>> public static void RaiseParserError(RubyScope scope, String msg) {
>>    RubyModule eParserError;
>>
>>    scope.RubyContext.TryGetModule(scope.GlobalScope,
>>        "JSON::ParserError",
>>        out eParserError
>>    );
>>
>>    RubyClass exceptionClass = eParserError as RubyClass;
>>    Type underlyingType = exceptionClass.GetUnderlyingSystemType();
>>
>>    BindingFlags bindingFlags = BindingFlags.NonPublic |
>>                                BindingFlags.Public |
>>                                BindingFlags.Instance;
>>
>>    ConstructorInfo constructor = underlyingType.GetConstructor(
>>        bindingFlags,
>>        null,
>>        new[] { typeof(RubyClass), typeof(String) },
>>        null
>>    );
>>
>>    Exception exceptionInstance = constructor.Invoke(
>>        new object[] { exceptionClass, msg }
>>    ) as Exception;
>>
>>    throw exceptionInstance;
>> }
>>
>>
>> --
>> Daniele Alessandri
>> http://www.clorophilla.net/blog/
>> _______________________________________________
>> Ironruby-core mailing list
>> Ironruby-core at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/ironruby-core
>>
>> _______________________________________________
>> Ironruby-core mailing list
>> Ironruby-core at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/ironruby-core
>>
>
>
>
> --
> Daniele Alessandri
> http://www.clorophilla.net/blog/
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>



-- 
Daniele Alessandri
http://www.clorophilla.net/blog/


More information about the Ironruby-core mailing list