Это - текущий вопрос в списке Lua, я предполагаю из-за поверхностного подобия этих двух языков.
, К сожалению, существует много важных различий, которые не так очевидны. Для создания его работать нужен или полноценный компилятор, предназначающийся для JS вместо байт-кода Lua, или переписывающий Lua VM в JavaScript.
я не знаю исходных целей Lua2js; но если бы это был просто ограниченный 'переводчик', затем пишущий, что код Lua намеревался быть переведенным, то отклонил бы большинство (все?) хороших вещей о Lua. Например, я не думаю, что Вы могли использовать функцию в качестве ключа таблицы, с тех пор в JavaScript ключи являются только строками (и числа? я не уверен).
выбор.NET более разумен, он мог быть сделан, изменив существующий компилятор для испускания байт-кода CLR вместо стандартного байт-кода Lua. Даже если CLR разработан и оптимизирован для другого вида языков, это достаточно определенно универсально для выполнения очень хорошо. Основное препятствие было бы доступностью библиотек.
Другая опция, которую я просто нашел, данная статья Roberto Ierusalmschy и Fabio Mascarenhas, где они исследуют перевод байт-код LuaVM в байт-код CLR.
, Как обычно на научных работах, нет никакого признака о дате, когда она была записана, таким образом, я понятия не имею, является ли это новым и революционным или старым и забыто.
Не желая ждать несколько месяцев, чтобы мой код снова столкнулся с этой ситуацией, я потратил некоторое время на 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
стал причиной сбоя в моей программе просто потому, что трассировка стека исключений из моей программы совпадает с трассировкой стека из тестовой программы. Проще говоря,
Теперь, когда вы знаете, что это может привести к сбою, давайте получим дополнительную информацию:
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);
}