Может ли JScript.NET различать разные типы исключений .NET - PullRequest
2 голосов
/ 20 февраля 2009

Я использую JScript.NET для написания скриптов в написанном мною приложении C # WinForms. Это работает очень хорошо, но я просто попытался добавить в скрипт некоторую обработку исключений, и я не могу понять, как определить, какой тип исключения был сгенерирован из моего кода C #.

Вот несколько примеров кода JScript, который выдает два разных типа исключений CLR, а затем пытается их перехватить и разделить.

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;
    }
}

Если я позвоню ErrorTest("foo"), я вернусь "Error 5022: Value does not fall within the expected range.", а если я позвоню ErrorTest("foobar"), я вернусь "Error 5022: Operation is not valid due to the current state of the object."

Свойства имени и номера идентичны, единственное отличие - это сообщение. Я не хочу начинать писать логику обработки ошибок на основе сообщений об ошибках, поэтому есть ли способ получить исходное исключение вместо объекта JScript Error?

Ответы [ 3 ]

3 голосов
/ 30 июня 2009

Используйте поддержку аннотаций типов в JScript .NET, например:

  try { }
  catch (e : ArgumentException) {
    // ...
  }
0 голосов
/ 25 февраля 2009

Исходное исключение можно получить с помощью метода ErrorObject.ToException , а затем использовать instanceof, чтобы решить, как его обработать.

Это работает, но я не решил, использовать ли это. Я думаю, что он злоупотребляет фреймворком, потому что в документации написано:

Этот API поддерживает инфраструктуру .NET Framework и не предназначен для использования непосредственно из вашего кода.

Также вам необходимо добавить ссылку на сборку Microsoft.JScript и импортировать пространство имен Microsoft.JScript.

Вот новый код:

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";
    }
}
0 голосов
/ 20 февраля 2009

Вы должны быть в состоянии сделать:

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;
    }
}

и таким образом выполняйте отдельную обработку ошибок для каждого типа исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...