20楼#
发布于:2002-11-21 09:14
好象不太好。
例子的关键思想是:一旦我们发现某个服务函数执行失败,我们仅仅执行一个return status语句。return status语句触发了终止处理程序的执行,这个处理程序消除了所有累积的副作用。 |
|
|
21楼#
发布于:2002-11-21 09:24
好象不太好。 但是在我的程序里面函数并没有修改或返回status值呀!对此应怎样处理? |
|
|
22楼#
发布于:2002-11-21 09:25
[quote]这个例子的处理比较好: sorry!还要再请教,不知我这样改行不行? ..... NTSTATUS status=STATUS_UNSUCCESSFUL; ..... __try { my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal); if(!my_Data) return STATUS_INSUFFICIENT_RESOURCES; copyPacketData(pPacket, my_Data, iTotal); pEthHdr=( PEthHead )my_Data; pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) ); } __finally { if(my_Data) ExFreePool((PVOID)my_Data); } return pIpHdr->destIPAddress; [/quote] 这样不好,__finally子句的作用是不管上面的程序(__try子句)执行是否导致异常,它都会被执行。一般用来执行一些清理的工作,如释放内存等。而__excpet子句是异常处理的Handler,有了它,你才能接管异常,例如,你可以在__except子句中向调试器输出一些字符串以帮助你判断程序出了什么错误(dbgprint)。所以,__except语句是用来帮助调试、捕捉程序错误的,没有它,有了__finally的意义也不大,除非你可以肯定上面的__try子句不会导致任何异常。 |
|
|
23楼#
发布于:2002-11-21 09:36
如果你不放在ADDDEVICE,对你的结构,确实可用
__try { } __except //(EXCEPTION_EXECUTE_HANDLER) { // KdPrint((\"Exception was caught\\n\")); } |
|
|
24楼#
发布于:2002-11-21 09:47
如果你不放在ADDDEVICE,对你的结构,确实可用 sorry!刚才出现死机。 好的,我已大概明白其中的道现,我再将程序加上__except,你看这样行吗? 我是刚刚接触NDIS,还请你不要见笑为好。 /////////////////////////////////////// ..... NTSTATUS status=STATUS_UNSUCCESSFUL; ..... __try { my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal); if(!my_Data) return STATUS_INSUFFICIENT_RESOURCES; copyPacketData(pPacket, my_Data, iTotal); pEthHdr=( PEthHead )my_Data; pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) ); } __except { DbgPrint(\"出现错误!!\"); } __finally { if(my_Data) ExFreePool((PVOID)my_Data); } return pIpHdr->destIPAddress; [编辑 - 11/21/02 by freeshar] |
|
|
25楼#
发布于:2002-11-21 10:10
[quote]如果你不放在ADDDEVICE,对你的结构,确实可用 sorry!刚才出现死机。 好的,我已大概明白其中的道现,我再将程序加上__except,你看这样行吗? 我是刚刚接触NDIS,还请你不要见笑为好。 /////////////////////////////////////// ..... NTSTATUS status=STATUS_UNSUCCESSFUL; ..... __try { my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal); if(!my_Data) return STATUS_INSUFFICIENT_RESOURCES; copyPacketData(pPacket, my_Data, iTotal); pEthHdr=( PEthHead )my_Data; pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) ); } __except { DbgPrint(\"出现错误!!\"); } __finally { if(my_Data) ExFreePool((PVOID)my_Data); } return pIpHdr->destIPAddress; [编辑 - 11/21/02 by freeshar] [/quote] 加了这一句,怎么编译不通过? __except { DbgPrint(\"出现错误!!\"); } |
|
|
26楼#
发布于:2002-11-21 10:21
[///////////////////////////////////////
..... NTSTATUS status=STATUS_UNSUCCESSFUL; ..... __try { my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal); if(!my_Data) return STATUS_INSUFFICIENT_RESOURCES; copyPacketData(pPacket, my_Data, iTotal); pEthHdr=( PEthHead )my_Data; pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) ); } __except { if(my_Data) ExFreePool((PVOID)my_Data); DbgPrint(\"出现错误!!\"); } return pIpHdr->destIPAddress; |
|
|
27楼#
发布于:2002-11-21 10:31
可以,最好加上错误的处理语句,例如返回,否则,程序会执行后面的语句。
关于__try,__except,__finally的用法,你还可以参阅MSDN中的相关主题。 |
|
|
28楼#
发布于:2002-11-21 10:47
可以,最好加上错误的处理语句,例如返回,否则,程序会执行后面的语句。 还是编译不通过? 在 __except{ if(my_Data) ExFreePool((PVOID)my_Data); DbgPrint(\"出现错误!!\"); return 0; } 也一样... why?? |
|
|
29楼#
发布于:2002-11-21 10:53
提示啥错误!
|
|
|
30楼#
发布于:2002-11-21 10:54
如果是这样就可以编译通过:
__except (ExFreePool((PVOID)my_Data),1) { if(my_Data) ExFreePool((PVOID)my_Data); DbgPrint(\"出现错误!!\"); return 0; } [编辑 - 11/21/02 by freeshar] |
|
|
31楼#
发布于:2002-11-21 10:58
你犯了个错误
一般是这样调用,参数的具体意义去看书。 __except (EXCEPTION_EXECUTE_HANDLER) 应该放分了! |
|
|
32楼#
发布于:2002-11-21 11:01
提示啥错误! 提示共有三行错误,如下: packet.c(41):error c2059:syntax error:\'{\' 对应程序的__except{ packet.c(57):error c2059:syntax error:\'return\' 对应 return pIpHdr->destIPAddress; packet.c(60):error c2059:syntax error:\'}\' 则对就于: } |
|
|
33楼#
发布于:2002-11-21 11:05
你犯了个错误 对呀, 有三个参数 EXCEPTION_CONTINUE_EXECUTION ( |
|
|
34楼#
发布于:2002-11-21 11:06
你犯了个错误 对呀, 有三个参数 EXCEPTION_CONTINUE_EXECUTION ( |
|
|
35楼#
发布于:2002-11-21 11:17
__except //在这儿用上面的三个参数之一代替(ExFreePool((PVOID)
my_Data),1) //////// __except(EXCEPTION_EXECUTE_HANDLER) { if(my_Data) ExFreePool((PVOID)my_Data); DbgPrint(\"出现错误!!\"); return 0; } |
|
|
36楼#
发布于:2002-11-21 16:21
__except //在这儿用上面的三个参数之一代替(ExFreePool((PVOID) [编辑 - 11/21/02 by freeshar] |
|
|
37楼#
发布于:2002-11-21 16:33
咋不能呢
你在TRY{]里面都可以。 或者你觉得该释放的任何地方。 但EXCEPT{}里一定要释放刚分配的。 |
|
|
38楼#
发布于:2002-11-21 16:46
咋不能呢 确实编译出错,提示为: packet(51):error c2143:syntax error:missing \';\' before \'__finally\' 另外还有两行。 |
|
|
39楼#
发布于:2002-11-21 17:27
[quote]咋不能呢 确实编译出错,提示为: packet(51):error c2143:syntax error:missing \';\' before \'__finally\' 另外还有两行。 [/quote] 我没说清楚。是不能用__finally。我以为你自己回答了。 上面是对你第二个问题的回答。 |
|
|