Как предупредить о неправильных номерах параметров в Console.Write ()? - PullRequest
1 голос
/ 21 декабря 2011

У нас есть программа с тысячами строк, таких как:

Console.Write("{0},{1} - {2}", e1, "My custom error", e2); // Write a custom error

Однако следующее вызовет ошибку, так как "{3}" больше, чем число параметров:

Console.Write("{0},{1} - {3}", e1, "My custom error", e2); // Write a custom error

Как я могу отсканировать весь мой проект, чтобы забрать его во время компиляции?

Обновление:

К сожалению, ReSharper не будет работать. Я создал свой собственный класс журналирования "w", который вызывает Console.Write и другие журналы за кулисами. ReSharper обнаруживает ошибки в «Console.Write», но игнорирует все параметры для указанного метода ведения журнала.

Обновление:

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

Обновление:

Спасибо за подсказку @adudley - в итоге я заменил все экземпляры «Console.Write» и «String.Format» в классе ведения журнала вызовами специализированных версий с try / catch для любых ошибок. Это позволяет избежать переполнения всей программы, если вызывается одна редко используемая функция регистрации с неверными параметрами. Я бы лучше сказал программе обеспечить ее пуленепробиваемость, а не вручную проверять 1000 функций регистрации на наличие трудно обнаруживаемых ошибок.

Ответы [ 5 ]

2 голосов
/ 21 декабря 2011

Статический анализ кода может сделать это для вас. Если у вас есть хотя бы Premium версия Visual Studio, вы можете включить ее в настройках своего проекта. В противном случае вы можете использовать FxCop для проверки ваших сборок после сборки.

Оба инструмента имеют встроенное правило, которое должно соответствовать вашим требованиям: Предоставить правильные аргументы для методов форматирования

2 голосов
/ 21 декабря 2011

Я предполагаю, что это, вероятно, какое-то огромное, не протестированное (возможно, не тестируемое!) Унаследованное приложение, но я добавлю слово для модульных тестов (например, NUnit) - вы можете использовать их с хорошими тест-двойниками библиотека (например, Rhino.Mocks) для выдачи различных ошибок и выполнения всех этих строк. Ошибки будут отображаться как ошибки теста до исправления:)

2 голосов
/ 21 декабря 2011

ты должен спросить, почему они ошибаются?Они должны быть правильными во время ввода, и если вы переводите их, проверяйте при импорте переводов (это то, что мы делаем).

2 голосов
/ 21 декабря 2011

Коммерческий плагин ReSharper автоматически находит именно эту ошибку (хотя я думаю, что вам нужно включить проверку всего проекта).Существует бесплатная пробная версия.

1 голос
/ 21 декабря 2011

Полагаю, это прекрасная возможность для небольшого рефакторинга (если, конечно, вы можете потратить время на это - если есть тысячи таких случаев, это может занять некоторое время;))

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

public static void ShowError(string e1, string e2)
{
    // possibly check for null / empty parameters if you need to.
    Console.Write("{0},{1} - {2}", e1, "My custom error", e2);
}

и заменить экземпляры на

ShowError(e1, e2);

Это дает вам гибкость, позволяющую сделать больше в методе, чем просто вывод на консоль - вы также можете записать ошибку ... Вам нужно только обновить один метод для вывода в другом формате./ в другое место.

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

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