Могу ли я игнорировать ошибку, не используя try catch ()? - PullRequest
2 голосов
/ 25 мая 2011

Итак, я хочу сейчас, если это возможно для языков .NET игнорировать ошибку без использования конструкции try catch?

Например, я могу игнорировать конфликт с #nowarring 40, могу ли я игнорировать ошибку?

Почему я этого хочу?

просто хотел вызвать системную паузу таким образом

open System.Runtime.InteropServices
[<DllImport(@"msvcrt.dll")>]
extern void system(string str)
system "pause"

, но получил сообщение об ошибке

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

Так что мне все равно, это работает.Но могу ли я просто игнорировать эту ошибку?не делая странных вещей вроде этого:

try (system "pause") catch |_->()

Хорошо, я решил свою проблему, добавив CallingConvention = CallingConvention.Cdecl, но каков был вопрос о пропуске исключений, и я до сих пор не знаю, смогу ли ясделайте это.

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

не по теме: пробное изображение об использовании void вместо int: proof

Ответы [ 7 ]

8 голосов
/ 25 мая 2011

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

Что касается ошибок компиляции и времени выполнения, Грэм уже указал на разницу.Если вы получаете необработанное исключение времени выполнения, это обычно означает, что ваша программа находится в несогласованном состоянии.Если программе будет разрешено продолжить, нет никаких гарантий относительно того, что произойдет.Для программы лучше умереть, чем продолжить работу с поврежденными данными.Вы можете посмотреть на событие AppDomain.UnhandledException , но оно позволяет только регистрировать исключение и выполнять некоторую очистку, после чего программа все равно завершится.Могут быть и другие варианты (в зависимости от вашего языка программирования), но их не рекомендуется использовать.

4 голосов
/ 25 мая 2011
  • В C # я не думаю, что есть способ игнорировать все исключения, кроме try ... catch
  • В VB.Net есть способ игнорировать все исключения:

Код VB.Net:

On Error Resume Next '' all exceptions after this point will be ignored  
System("pause")

Но это опасная функция.Исключения следует игнорировать только в том случае, если

  1. Вы абсолютно уверены, что понимаете, почему они произошли
  2. Вы абсолютно уверены, что их можно безопасно игнорировать.

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

4 голосов
/ 25 мая 2011

Нет. Когда вы говорите о игнорировании предупреждений, это компилятор предупреждений. Вы можете игнорировать их, если хотите, но они обычно предупреждают вас о чем-то по уважительной причине. Вы не можете игнорировать ошибки компилятора , потому что когда они возникают, ваш код не компилируется и у вас нет исполняемого файла.

Когда вы говорите об ошибках в своем вопросе, вы на самом деле имеете в виду исключения . Они выбрасываются во время выполнения. Единственный способ «игнорировать» их - это иметь блок try / catch, который перехватывает исключение и ничего с ним не делает.

Кроме того, если вам действительно необходимо игнорировать исключение, лучше всего поймать конкретное исключение , которое вы хотите игнорировать, а не любое исключение. Итак, вместо чего-то вроде этого:

try
{
   ...
}
catch
{
}

или

try
{
   ...
}
catch(Exception)
{
}

вы должны попытаться использовать

try
{
   ...
}
catch(SpecificExceptionType)
{
}
1 голос
/ 25 мая 2011

Или вы можете просто отключить MDA.

1 голос
/ 25 мая 2011

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

let ignoreError func defaultValue =
    try func() with _ -> defaultValue
1 голос
/ 25 мая 2011

Почему бы вам не объявить это так:

extern int system(string str)

Ваш компилятор сообщает вам кое-что важное: он сообщает, что функция system возвращает int ине знаю, что с этим делать.Вы должны убедиться, что ваша подпись соответствует!

0 голосов
/ 27 августа 2015

Один из подходов заключается в создании метода, который принимает объект System.Action и передает для выполнения лямбда-выражение, а затем всякий раз, когда вы хотите выполнить что-то и игнорировать все ошибки, просто оберните вызов этого метода вокруг него.Это показано ниже.

    public void IgnoreError(System.Action action)
    {
        try
        {
            action.Invoke();
        }
        catch
        {
        }
    }

    public void SomeMethod()
    {
        IgnoreError(() => { system "pause"; });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...