Friday, April 8, 2011

Can JScript.NET distinguish different .NET exception types

I'm using JScript.NET to write scripts in a C# WinForms application I wrote. It works really well, but I just tried putting some exception handling in a script, and I can't figure out how to tell what type of exception was thrown from my C# code.

Here's some example JScript code that throws two different types of CLR exception, and then tries to catch them and tell them apart.

function ErrorTest(name)
{
    try
    {
        if (name.length < 5)
        {
            throw new ArgumentException();
        }else
        {
            throw new InvalidOperationException();
        }
    }catch (e)
    {
        return e.name + " " + (e.number & 0xFFFF) + ": " + e.message;
    }
}

If I call ErrorTest("foo"), then I get back "Error 5022: Value does not fall within the expected range.", and if I call ErrorTest("foobar"), then I get back "Error 5022: Operation is not valid due to the current state of the object."

The name and number properties are identical, the only difference is the message. I don't want to start writing error handling logic based on the error messages, so is there some way to get at the original exception instead of the JScript Error object?

From stackoverflow
  • You should be able to do:

    function ErrorTest(name)
    {
        try
        {
            if (name.length < 5)
            {
                throw new ArgumentException();
            }else
            {
                throw new InvalidOperationException();
            }
        }
        catch (ArgumentException e)
        {
            return "Argument Exception: " + e.message;
        }
        catch (InvalidOperationException e)
        {
            return "Operation Exception: " + e.message;
        }
        catch (e)
        {
            return "Unknown Exception: " + e.message;
        }
    }
    

    and do separate error handling for each exception type that way.

    Don Kirkby : Thanks, but the sample is JScript code, so the catch statement doesn't allow an exception type. All I seem to be allowed is a variable name.
    Andy Mikula : Good point. You can throw new Error(number,"MessageString") and test the number that way. I think you might be out of luck trying to manipulate CLR exceptions from JScript.
  • You can get the original exception using the ErrorObject.ToException method, and then use instanceof to decide how to handle it.

    This works, but I haven't decided whether to use it. I think it's abusing the framework, because the documentation says:

    This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

    Also, you'll have to add a reference to the Microsoft.JScript assembly and import the Microsoft.JScript namespace.

    Here's the new code:

    function ErrorTest(name)
    {
        try
        {
            if (name.length < 5)
            {
                throw new ArgumentException();
            }else
            {
                throw new InvalidOperationException();
            }
        }catch (e)
        {
            var ex = ErrorObject.ToException(e);
            if (ex instanceof ArgumentException)
            {
                return "bad argument";
            }
            return "something bad";
        }
    }
    
    Don Kirkby : I'm leaving this here for reference, but the accepted answer is obviously much better.
  • Use JScript .NET's type annotation support, like so:

      try { }
      catch (e : ArgumentException) {
        // ...
      }
    
    Don Kirkby : Sweet! Where were you four months ago? I guess I should have kept hunting through the JScript documentation.
    Christopher Done : I thought the same thing! Where as I four months ago!? Indeed, I have read pretty much all of the JScript docs and been the better for it.

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.