Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C# - получение кода системной ошибки


Автор: valent_N 3.1.2006, 15:18
Здравствуйте!
C#-программа должна обрабатывать ошибки с учетом их кода. Какой культурный способ существует для получения кода системной ошибки и сброса ее, аналогично тому, как это позволяют сделать Win32 API-функции GetLastError() и SetLastError(...)? Или, все же, надо вызывать именно их, обеспечив для них соответствующие прототипы? Или же надо прибегнуть к исключению? Как тогда получить из экземпляра исключения код ошибки? - я не смог найти в MSDN такую информацию.
Большое Спасибо

Автор: Void 3.1.2006, 15:23
Посмотрите на метод System.Runtime.InteropServices.Marshal.GetLastWin32Error и класс исключения System.ComponentMode.Win32Exception.

Автор: WTF 3.1.2006, 15:30
Не совсем понятно о каких системных ошибках идет речь. Наиболее распространенные ошибки реализованы в виде исключений (exceptions). Например:
Код

try
{
    // этот код генерирует ошибку
    DoSomthing();
}
catch(OutOfMemoryException ex)
{
    // обработка ошибки
}


Если стандартные классы исключений по како-то причине тебе не подходят - у класса System.Exception есть свойсво HRESULT который содержит код ошибки.

Сбрасывать ошибку не надо.

Автор: Exception 3.1.2006, 15:53
Цитата(WTF @ 3.1.2006, 16:30)
Сбрасывать ошибку не надо.

Это он говорит о стандартных ошибках Win32.
Полностью согласен с
Void.
А вообще не пойму, что мешает пользоваться
Цитата(valent_N @ 3.1.2006, 16:18)
GetLastError() и SetLastError(...)

?

Автор: Void 3.1.2006, 15:55
Цитата(Exception @ 3.1.2006, 17:53)
А вообще не пойму, что мешает пользоваться

Читай документацию на Marshal.GetLastWin32Error smile Там ясно сказано:
Цитата
GetLastWin32Error exposes the Win32 GetLastError API method from Kernel32.DLL. This method exists because it is not safe to make a direct platform invoke call to GetLastError to obtain this information. If you want to access this error code, you must call GetLastWin32Error rather than writing your own platform invoke definition for GetLastError and calling it. The common language runtime can make internal calls to APIs that overwrite the operating system maintained GetLastError.

Автор: valent_N 3.1.2006, 16:04
Очень всем признателен за внимание к моему вопросу. Я с Вашей помощью смог разобраться и получить полезную информацию, которую сам не смог найти.


Цитата(Exception @ 3.1.2006, 15:53)
А вообще не пойму, что мешает пользоваться


Хотелось узнать, какой метод более рационален.

Большущее ВСЕМ СПАСИБО!!!

Автор: Exception 3.1.2006, 16:05
А SetLastError тама разве есть?

Автор: arilou 4.1.2006, 13:33
Цитата(Exception @ 3.1.2006, 16:05 Найти цитируемый пост)

А SetLastError тама разве есть?

А SetLastError нужен для апишных ф-ций. Для .NET приложений не нужен.

Автор: redig 14.2.2007, 06:29
Цитата(valent_N @ 3.1.2006,  15:18)
Здравствуйте!
Какой культурный способ существует для получения кода системной ошибки?

Я так и не понял из этого топика как получить код ошибки. у меня например такая ситуация:
Вываливаются ошибки:
14.02.2007 12:05:48|Ошибка OutSocket() : Object reference not set to an instance of an object.
14.02.2007 12:06:46|Ошибка OutSocket() : Удаленный хост принудительно разорвал существующее подключение

на одном Exception-e:
Код

        public static void OutSocket()
        {
            try
            {
                Data msgToSend = new Data();

                msgToSend.cmdCommand = Command.Logout;
                msgToSend.strName = CLName;
                msgToSend.strMessage = null;

                byte[] byteData = msgToSend.ToByte();

                //Send it to the server
                clientSocket.Send(byteData, 0, byteData.Length, SocketFlags.None);
                clientSocket.Close();
                               

            }
            catch (Exception ee)
            {
                LogingClass.SaveLoging(DateTime.Now.ToString() + "|Ошибка OutSocket() : " + ee.Message);
                //MessageBox.Show("Ошибка OutSocket() : " + ee.Message);
            }
        }


Тут говорили про HResult, в MSDN-е не понятно написано, если кто знает, покажите пожалуйста примером как вытащить из Exception-а код ошибки.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)