Подтвердить что ты не робот

Какие коды выхода могут иметь .net-программу, когда Environment.Exit() не используется?

Если программе .net не удается явно установить код выхода до завершения (вызывая Environment.Exit()/Appliation.Current.Shutdown()/...), каков код выхода для этого процесса?

Нормальное завершение всегда приводит к нулю кода выхода, и каковы другие возможные случаи?

В соответствии с этим ответом к соответствующему вопросу Получение ExitCode из обработчика исключений от Hans Passant: "if программа умирает при исключении, тогда ее код выхода обычно совпадает с исходным кодом ошибки исключения".

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

Существуют ли другие обстоятельства, в которых инфраструктура .net или Windows могут автоматически устанавливать другой код выхода, например, какой-либо связанный с исключениями сбой (возможно ли это?) или принудительная задача убить?

Иными словами, могу ли я определить по коду выхода, прекращена ли программа каким-либо ненормальным способом или нет?
Или если код выхода из нуля может произойти и в некоторых аномальных случаях, могу ли я включить Environment.Exit(somevalue) во все обычные пути завершения для программы и убедиться, что этот код выхода никогда не может произойти в случае сбоя?


Мотивация:
Поскольку не все исключения являются захватывающими без серьезных обходных решений, и поскольку могут возникнуть другие причины внезапного прекращения программы, отличные от неперехваченных исключений, убедитесь, что все пути кода вызвали Environment.Exit() не является возможным. Вот почему меня интересует определение того, можно ли использовать код выхода, чтобы достоверно определить, нормально ли вышла программа.

4b9b3361

Ответ 1

то его код выхода обычно совпадает с кодом ошибки исключений

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

Есть слишком много вещей, которые хотят быть вовлеченными в это, и это не всегда лучшее качество. В верхней части списка, безусловно, есть анти-вредоносное ПО, там много cr * pware, и вы никогда не узнаете, с чем столкнулись. Недавняя катастрофа Аваста дает множество причин, чтобы беспокоиться об этом. Не так, где он заканчивается, утилиты, которые заменяют WER, достаточно распространены.

И вы абсолютно беззащитны против yokel, который считает, что TerminateProcess() - хороший способ решить проблему блокировки файлов. Или кто-то отключился от шнура питания и отсоединил машину.

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

Ответ 2

Является ли процесс, который вы выполняете самостоятельно? То есть, можете ли вы контролировать его код выхода в предсказуемых обстоятельствах? Если это так, вы можете поймать любое вызванное исключение, а затем вернуть свой собственный предсказуемый ненулевой код исключения (конкретное значение или собственный диапазон.) Я бы использовал отрицательное число, поскольку коды системных ошибок положительны. Таким образом у вас есть три возможности:

  • Нуль - успех
  • Отрицательный - процесс сделал исключение, которое вы смогли поймать
  • Положительный - процесс забросил исключение, которое вы не смогли поймать. Это было бы ненормально.

Ничто другое, кроме этого, кажется непредсказуемым. Если что-то пока что выходит за рамки обычного, что процесс не может даже вернуть ненулевой код выхода, тогда процесс, ожидающий этого кода выхода, также может быть неудачным. Проверка на ненулевой код выхода - это то, что вы можете разумно сделать, чтобы учесть возможность отказа из-за каких-либо непредвиденных причин.

Я не знаю, возможно ли # 3, но если вы пытаетесь объяснить неизвестное, то это, вероятно, самое большее, что вы можете сделать.

Вот пример:

internal class Program
{
    private static void Main(string[] args)
    {
        var exitCode = 0;
        try
        {
            //do something
        }
        catch (SystemException systemEx)
        {
            //log
            exitCode = -systemEx.HResult;
        }
        catch (Exception ex)
        {
            //log
            Environment.ExitCode = int.MinValue;

        }
        Environment.ExitCode = exitCode;
    }
}

Что ты мог сделать. Но я бы не использовал код выхода для описания ошибки. Я бы использовал для этого журнал. Я бы использовал код выхода, чтобы сообщить вызывающему приложению, что делать. Для этого, вероятно, достаточно нулевого или ненулевого. Я написал более сложные коды возврата, которые указывают, был ли сбой связан с IO или связан с SQL, и в конце концов я никогда не использовал его. Если это не удается, я просматриваю свой журнал для сообщения об ошибке.