Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/C++/Exception Handling in C++"
From Apache OpenOffice Wiki
		< Zh | Documentation
		
		
|  (New page: {{Documentation/DevGuide/ProUNOTOC/Zh |ProUNO2c=block |ProUNO2cC++=block |ShowPrevNext=block |PrevPage=Zh/Documentation/DevGuide/ProUNO/C++/Using Weak References |NextPage=Zh/Documentation...) | m | ||
| Line 6: | Line 6: | ||
| |NextPage=Zh/Documentation/DevGuide/ProUNO/Basic/OpenOffice.org Basic | |NextPage=Zh/Documentation/DevGuide/ProUNO/Basic/OpenOffice.org Basic | ||
| }} | }} | ||
| − | + | {{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/C++/{{SUBPAGENAME}}}} | |
| {{DISPLAYTITLE:C++ 中的异常处理}} | {{DISPLAYTITLE:C++ 中的异常处理}} | ||
Latest revision as of 02:51, 14 May 2009
要抛出和捕获 UNO 异常,可使用常规的 C++ 异常处理机制。调用 UNO 接口可能仅抛出 com::sun::star::uno::Exception 或派生的异常。以下示例可捕获每个可能的异常:
 try 
 {
     Reference< XInterface > rInitialObject = 
     xUnoUrlResolver->resolve( OUString::createFromAsci( 
     "uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" ) );
 }
     catch( com::sun::star::uno::Exception &e )
 {
     OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
     printf( "An error occurred: %s\n", o.pData->buffer );
 }
如果希望对每个可能的异常类型做出不同的反应,请查找可能由某个特定方法抛出的异常。例如,com.sun.star.bridge.XUnoUrlResolver 中的 resolve() 方法可以抛出三种异常。分别捕获每种异常类型:
 try
 {
     Reference< XInterface > rInitialObject = 
     xUnoUrlResolver->resolve( OUString::createFromAsci( 
     "uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" ) );
 }
 catch( ConnectionSetupException &e )
 {
     OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
     printf( "%s\n", o.pData->buffer );
     printf( "couldn't access local resource ( possible security resons )\n" );
 }
 catch( NoConnectException &e )
 {
     OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
     printf( "%s\n", o.pData->buffer );
     printf( "no server listening on the resource\n" );
 }
 catch( IllegalArgumentException &e )
 {
     OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
     printf( "%s\n", o.pData->buffer );
     printf( "uno URL invalid\n" );
 }
 catch( RuntimeException & e )
 {
     OString o = OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US );
     printf( "%s\n", o.pData->buffer );
     printf( "an unknown error has occurred\n" );
 }
实现您自己的 UNO 对象时(请参阅 编写 UNO 组件 - C++ 组件),使用常规的 C++ throw 语句抛出异常: 
 void MyUnoObject::initialize( const Sequence< Any > & args.getLength() ) throw( Exception )
 {
     // we expect 2 elements in this sequence
     if( 2 != args.getLength() )
     {
         // create an error message
         OUStringBuffer buf;
         buf.appendAscii( "MyUnoObject::initialize, expected 2 args, got " );
         buf.append( args.getLength() );
         buf.append( "." );
 
         // throw the exception
         throw Exception( buf.makeStringAndClear() , *this );
     }
     ...
 }
请注意:UNO 接口方法只能抛出从 com::sun::star::uno::Exception 派生的异常。如果调用程序和被调用的对象不是位于同一 UNO 运行时环境,就不能通过 UNO 运行时桥接其他异常(例如,C++ std::exception)。而且,多数当前 Unix C++ 编译器(例如,gcc 3.0.x)不编译代码。编译期间,派生类中的异常规范被放宽,可以抛出除派生的接口中指定的异常以外的异常。抛出未指定的异常会导致 std::unexpected 异常,并且 Unix 系统会中止程序。 
| Content on this page is licensed under the Public Documentation License (PDL). | 

