Я рассмотрел бы упрощение Вашего веб-приложения путем включения Elmah.
Вы добавляете блок Elmah к своему проекту и затем настраиваете Ваш web.config. Это затем зарегистрирует исключения, созданные на уровне страницы или контроллере. Это может быть настроено для входа к всевозможным местам (как SQL Server, электронная почта и т.д.). Это также обеспечивает сеть frontend, так, чтобы можно было просмотреть журнал исключений.
первая вещь я добавляю к любому asp.net mvc приложение, которое я создаю.
я все еще использую log4net, но я склонен использовать его для входа отладки/информации и оставлять все исключения Elmah.
можно ли также найти больше информации в вопросе , Как Вы регистрируете ошибки (Исключения) в Ваших приложениях ASP.NET? .
Вот один способ:
int f_real_name(void)
{
...
}
#define f f_real_name
int g(void)
{
// call f()
}
#undef f
// calling f() now won't work
Другой способ, если вы можете гарантировать, что f ()
и g ()
- единственные функции в файл, состоит в том, чтобы объявить f ()
как static
.
РЕДАКТИРОВАТЬ: Еще один трюк с макросами, вызывающий ошибки компилятора:
static int f(void) // static works for other files
{
...
}
int g(void)
{
// call f()
}
#define f call function
// f() certainly produces compiler errors here
Поместите g () и f () в один и тот же модуль и объявите f () статическим. Ключевое слово static делает f () доступным только для функций в том же модуле или исходном файле.
Вы также можете упомянуть, что никакие другие методы не должны быть разрешены в модуле с f () и g (), иначе они можно было бы вызвать f ().
PS - Я действительно думаю, что ответ Криса Лутца на самом деле лучший. В нем упоминается этот подход, но также упоминается умное переименование макроса, которое работает с меньшим количеством условий окружающей среды (не требует файла модуля специально для этих двух функций).
Также обратите внимание, что с помощью макроса вы можете сделать следующее:
#define f() f_should_not_be_called_by_anything_except_g
В результате появилось бы красивое сообщение об ошибке, а программы автозаполнения (например, Visual Studio) покажут этот совет, когда пользователь наберет f ().
You может создавать частные для модуля функции с ключевым словом static
:
static void func(void)
{
// ...
}
Тогда func ()
может вызываться только другими функциями, определенными в том же файле (технически то же самое ] единица трансляции : другие функции, определения которых включены в директиву #include
, все еще могут получить к ней доступ). func
, как говорят, имеет внутреннюю связь . Все остальные функции (то есть без ключевого слова static
) имеют внешнюю связь.
Кроме того, нет, нет способа сделать функции недоступными. Вы можете использовать макросы для изменения имени функции, но другой код всегда может получить к ней доступ с соответствующим именем.
Поместите f ()
и g ()
в один исходный файл, объявите f ()
static.
Для GCC можно использовать вложенных функций . Хотя это не стандартный C, он работает довольно хорошо.
Это возможно только по совпадению.
Если функции f () и g () находятся в одном исходном файле, и в этом файле нет других функций, и если g () никогда не возвращает указатель функции на f () для любого из его вызывающих, тогда создание статической f () выполнит свою работу.
Если другие функции должны появляться в том же исходном файле, поместите f () в конец файла как статический функция