1. C++ / Говнокод #7028

    +153

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    try
    			{
    				sw = gcnew StreamWriter(GetIniFileName());
    			}
    			catch(UnauthorizedAccessException^ e)
    			{
    				MessageBox::Show( "Access is denied.", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(ArgumentNullException^ e)
    			{
    				MessageBox::Show( e->ParamName + ": File path is null.", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(ArgumentException^ e)
    			{
    				MessageBox::Show( e->ParamName + ": Wrong file path.", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(DirectoryNotFoundException^ e)
    			{
    				MessageBox::Show( "The specified path is invalid, such as being on an unmapped drive.", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(PathTooLongException^ e)
    			{
    				MessageBox::Show( "The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters. ", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(IOException^ e)
    			{
    				MessageBox::Show( "File path includes an incorrect or invalid syntax for file name, directory name, or volume label syntax. ", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(SecurityException^ e)
    			{
    				MessageBox::Show( "The caller does not have the required permission." + e->ToString(), "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error );
    				ShowException(dynamic_cast<System::Exception^>(e));
    				return;
    			}
    			catch(System::Exception^ e)
    			{
    				ShowException(e);
    				return;
    			}

    Обработка исключений.

    Запостил: ScumCoder, 22 Июня 2011

    Комментарии (21) RSS

    • Ещё одну портянку С++\CLI запостили не в тот раздел.
      Ответить
    • dynamic_cast здесь "реально в тему"...
      Ответить
    • Не хватает catch(...)
      Ответить
      • catch(System::Exception^ e) вполне его заменяет, я думаю.
        Ответить
        • Не заменяет.
          GetIniFileName() вполне может содержать неуправляемый код, который кинет неуправляемое исключение.
          А catch(System::Exception^ e) ловит только управляемые исключения.
          Ответить
          • >А catch(System::Exception^ e) ловит только управляемые исключения.
            Плюс к этому можно ведь создать не наследуемое от System::Exception исключение. Хотя
            это и не гуд практик.
            Ответить
            • >Плюс к этому можно ведь создать не наследуемое от System::Exception исключение.
              Управляемое в С++\CLI нельзя.
              Ответить
              • >Управляемое в С++\CLI нельзя.
                Может всё таки речь о /clr:safe?
                Ответить
                • Нет. MSIL (на нём реализует управляемый код) по стандарту на данный момент не поддерживает исключения, у которых нет предка System::Exception. А в неуправляемом коде сгенерить управляемое исключение (типа exceptionType^) не возможно.

                  Вот в неуправляемом коде можно сгенерить исключение любого типа, хоть int или byte*, но catch(System::Exception^ e) их не ловит, зато ловит catch(...) или catch с соответствующим типом.
                  Ответить
                  • using namespace System;
                    
                    ref class MyException 
                    {
                    public:
                    	MyException() { }
                    };
                    
                    int f()
                    {
                    	throw gcnew  MyException();
                    }
                    
                    int main(array<System::String ^> ^args)
                    {
                    	try
                    	{
                    		f();	
                    	}
                    	catch( System::Exception^ )
                    	{
                    		Console::WriteLine(L"System::Exception");	
                    	}
                    	catch( ... )
                    	{
                    		Console::WriteLine(L"...");	
                    	} 
                    
                        return 0;
                    }

                    VS 2010. Собирается с /clr. Как думаете в какой catch попадем? :)
                    Ответить
                    • Странно. Вроде как на 2.0 фреймворке в 2005ой студии у меня ругалось на строчку throw gcnew MyException();, мол "не нельзя делать throw для класса не наследника System::Exception". Что-то поменялось?
                      Ясно, спасибо за информацию.
                      Ответить
                      • Пожалуйста. Впредь советую высказывания проверять на достоверность перед публикацией :)
                        Ответить
                • Кстати, даже catch(System::Exception^ e) не может "остановить" некоторые управляемые исключения, но это всем известно...
                  Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий