Uri. TryCreate бросает UriFormatException?

Это - текущий вопрос в списке Lua, я предполагаю из-за поверхностного подобия этих двух языков.

, К сожалению, существует много важных различий, которые не так очевидны. Для создания его работать нужен или полноценный компилятор, предназначающийся для JS вместо байт-кода Lua, или переписывающий Lua VM в JavaScript.

я не знаю исходных целей Lua2js; но если бы это был просто ограниченный 'переводчик', затем пишущий, что код Lua намеревался быть переведенным, то отклонил бы большинство (все?) хороших вещей о Lua. Например, я не думаю, что Вы могли использовать функцию в качестве ключа таблицы, с тех пор в JavaScript ключи являются только строками (и числа? я не уверен).

выбор.NET более разумен, он мог быть сделан, изменив существующий компилятор для испускания байт-кода CLR вместо стандартного байт-кода Lua. Даже если CLR разработан и оптимизирован для другого вида языков, это достаточно определенно универсально для выполнения очень хорошо. Основное препятствие было бы доступностью библиотек.

Другая опция, которую я просто нашел, данная статья Roberto Ierusalmschy и Fabio Mascarenhas, где они исследуют перевод байт-код LuaVM в байт-код CLR.

, Как обычно на научных работах, нет никакого признака о дате, когда она была записана, таким образом, я понятия не имею, является ли это новым и революционным или старым и забыто.

12
задан Jim Mischel 13 July 2009 в 15:46
поделиться

2 ответа

Не желая ждать несколько месяцев, чтобы мой код снова столкнулся с этой ситуацией, я потратил некоторое время на ILDASM, чтобы выяснить, что делает TryCreate , а затем еще немного времени придумал способ воспроизвести ошибку.

Причина сбоя в Uri.TryCreate (Uri baseUri, Uri relativeUri, out Uri result) , похоже, плохо отформатирована в baseUri . Например, конструктор Uri допускает следующее:

Uri badUri = new Uri("mailto:test1@mischel.comtest2@mischel.com");

Согласно RFC для mailto: URI, это недопустимо. И хотя конструктор создает и возвращает объект Uri , попытка доступа (к некоторым из) его свойств вызывает исключение UriFormatException . Например, учитывая приведенный выше код, эта строка вызовет исключение:

string badUriString = badUri.AbsoluteUri;

Я нахожу довольно интересным, что класс Uri , похоже, использует два разных алгоритма синтаксического анализа: один используется во время построения, а другой используется внутри для получения отдельных компонентов.

Передача этого недопустимого Uri в TryCreate приведет к исключению, которое я описал в исходном вопросе. Метод TryCreate проверяет параметр baseUri на предмет null , но не может (не могу, я полагаю) проверить это иначе. Он должен предполагать, что, если параметр не равен нулю, переданный объект является полностью инициализированным и действительным экземпляром Uri . Но в какой-то момент при построении результата TryCreate пытается получить компоненты baseUri , и выдается исключение.

Я не могу сказать, что моя программа действительно обнаружила mailto : URL, отформатированный таким образом. Однако я могу сказать с некоторой степенью уверенности, что недопустимый объект Uri стал причиной сбоя в моей программе просто потому, что трассировка стека исключений из моей программы совпадает с трассировкой стека из тестовой программы. Проще говоря,

20
ответ дан 2 December 2019 в 07:22
поделиться

Теперь, когда вы знаете, что это может привести к сбою, давайте получим дополнительную информацию:

static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result)
{
    try {
        if (!Uri.TryCreate(baseUri, relstr, out result))
        {
            return false;
        }
    }
    catch (UriFormatException ex) {
        throw new InvalidOperationException(
            String.Format("Can create URI for base={0}, rel={1}", baseUri.ToString(), relstr),
            ex);
    }        
    return CleanupUri(result, out result);
}
3
ответ дан 2 December 2019 в 07:22
поделиться