第一篇:第1章 命名空间与异常处理
版本控制页
版本控制表
序号 版本号 V0.00 版本性质 初稿 一校 二校 10.16.2008
2008.10.30
孔祥萍 赵元
王文丛
创建时间
建议人
修订人
修改日期
修改内容简述
备注
第1章 命名空间与异常处理
本章主要内容:
命名空间的定义 命名空间的访问 异常处理的概念 异常处理的机制 多层级间的异常处理 异常处理的堆栈操作
本章重点:
命名空间的定义与命名空间的访问 异常处理的机制和实现 多层级间的异常处理
本章难点:
命名空间的访问
多层级间的异常处理 异常处理的堆栈操作
学完本章您将能够:
了解命名空间概念 掌握命名空间定义 了解异常处理的机制 掌握异常处理的方法
掌握多层级间的异常处理方法 了解异常处理中的堆栈操作
引言
在一个给定作用域中定义的每个名字在该作用域中必须是惟一的,对庞大、复杂的应用程序而言,这个要求可能难以满足。这样的应用程序在全局作用域中,一般有许多名字定义。由独立开发的库构成的复杂程序更有可能遇到名字冲突,本章用命名空间的技术来解决此类问题。
C++中的异常处理是一种灵活并且精巧的工具。它克服了C语言的传统错误处理方法的缺点,并且能够被用来解决一系列运行期的错误。但是,异常处理也像其他语言特性一样,很容易被误用。为了能够有效的使用这一特性,了解运行期机制如何工作以及相关的性能花费是非常重要的。
1.1 命名空间
1.1.1 命名空间的定义
命名空间定义以关键字namespace开始,后接命名空间的名字。命名空间名字后面由大括号括住的一块声明和定义区域构成,可以在命名空间中放入可以出现在全局作用域的任意声明:类、变量(以及它们的初始化)、函数(以及它们的定义)、模板以及其他命名空间。
namespace GameCollege {
class Matrix { /*...*/ };
void Inverse(matrix &);
const double PI = 3.1416;} 这段代码定义了名为 GameCollege的命名空间,它有3个成员:一个类、一个函数、一个常量。
像其他名字一样,命名空间的名字在定义该命名空间的作用域中必须是惟一的。命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。命名空间作用域不能以分号结束。
定义在命名空间中的实体称为命名空间成员。像任意作用域的情况一样,命名空间中的每个名字必须引用该命名空间中的惟一实体。因为不同命名空间引入不同作用域,所以不同命名空间可以具有同名成员。在命名空间中定义的名字可以被命名空间中的其他成员直接访问,命名空间外部的代码必须指出名字定义在哪个命名空间中。在命名空间之外使用空间的成员必须用空间名字进行修饰。
#include
与其他作用域不同,命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。一个命名空间的分离部分可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。当然,名字只在声明名字的文件中可见,这一常规限制继续应用,所以,如果命名空间的一个部分需要使用定义在另一文件中的名字,仍然必须声明该名字。
1.1.2 嵌套命名空间
一个嵌套命名空间,即是一个嵌套作用域,其作用域嵌套在包含它的命名空间内部。嵌套命名空间中的名字遵循常规规则:外围的命名空间中声明的名字被嵌套命名空间中同一名字的声明所屏蔽。嵌套命名空间内部定义的名字局部于该命名空间。外围的命名空间之外的代码只能通过限定名访问嵌套命名空间中的名字。
嵌套命名空间可以改进库中代码的组织:
namespace GameCollege
// 外围的命名空间 {
namespace QueryLib
// GameCollege的嵌套命名空间QuerLib
{
class Query { /*...*/ };
Query operator&(const Query&, const Query&);
//...}
namespace Bookstore
// GameCollege的嵌套命名空间Bookstore {
class Item_base { /*...*/ };
class Bulk_item : public Item_base { /*...*/ };
//...} } 命名空间GameCollege现在包含两个嵌套命名空间:名为QueryLib的命名空间和名为Bookstore的命名空间。
当程序库提供者为了防止库中每个部分的名字与库中其他部分的名字起冲突的时候,嵌套命名空间是很有用的。
嵌套命名空间中成员的名字由外围命名空间的名字和嵌套命名空间的名字构成。例如,嵌套命名空间QueryLib中声明的类的名字是:
GameCollege::QueryLib::Query 1.1.3 命名空间的访问
如:命名空间名namespace_name::member_name,成员名这样引用命名空间的成员无可否认是很麻烦,特别是命名空间名字很长的时候。可以使用更简洁的方式使用命名空间的成员。
using 声明
【实例1-1】using声明
#include
cout << "Hello, World!" << endl;
return 0;} 使用using声明能使命名空间std中的名字cout、endl在当前作用域中可见,可以无须限定符std::而使用名字cout、endl。using声明中引入的名字遵循常规作用域规则。从using声明点开始,直到包含using声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。简写名字只能在声明它的作用域及其嵌套作用域中使用,一旦该作用域结束了,就必须使用完全限定名。using声明可以出现在全局作用域、局部作用域或者命名空间作用域中。类作用域中的using声明局限于被定义类的基类中定义的名字。
命名空间别名
可用命名空间别名将较短的同义词与命名空间名字相关联。例如:
namespace GameCollegeLib {
} const MyClass cMyClass = MyClass();void PrintfMyClass(const MyClass& myClass);class MyClass { public:
};void SetValue(int v){ iValue = v;} int GetValue()const { return iValue;} int iValue;MyClass(): iValue(0){}
private: 这样的长命名空间名字,可以像下面这样与较短的同义词相关联:
namespace gc = GameCollegeLib;命名空间别名声明以关键字namespace开头,接(较短的)命名空间别名名字,再接 =,最后接原来的命名空间名字和分号。如果原来的命名空间名字是未定义的,程序将会出错。
【实例1-2】命名空间别名
#include
namespace gc = GameCollegeLib;
int main(){
std::cout << gc::cMyClass.GetValue()<< std::endl;gc::MyClass myClass;
myClass.SetValue(45);
gc::PrintfMyClass(myClass);
} return 0;上例程序中gc是GameCollegeLib的别名,可以通过gc访问GameCollegeLib命名空间中成员。
一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。
using 指示的形式
“using指示”以关键字using开头,后接关键字namespace,再接命名空间名字。如果该名字不是已经定义的命名空间名字,程序将会出错。
using namespace std;
“using指示”使得特定命名空间所有名字可见,没有限制。短格式名字可从“using指示”点开始使用,直到出现“using指示”的作用域的末尾。
【实例1-3】using指示的形式访问命名空间
namespace GameCollegeLib {
int i = 16, j = 15, k = 23;
// 命名空间其他成员 } int j = 0;void manip(){
using namespace GameCollegeLib;// using 指示GameCollegeLib空间中名称全部可见
++i;
// 设置GameCollegeLib::i为17
++j;
// 错误:名称冲突,无法确定是全局j还是GameCollegeLib::j
++::j;
// 设置全局变量j为1
++GameCollegeLib::j;// 设置GameCollegeLib::j为16
int k = 97;
// 定义局部变量k将覆盖GameCollegeLib::k
++k;
// 设置局部变量k赋值为98 } manip中的“using指示”使manip能够直接访问GameCollegeLib中的所有名字:使用它们的简化形式,该函数可以引用这些成员的名字。
GameCollegeLib的成员看来好像是在定义GameCollegeLib和manip的作用域中定义的一样。如果在全局作用域中定义GameCollegeLib,则GameCollegeLib的成员看来好像是声明在全局作用域的一样。因为名字在不同的作用域中,manip内部的局部声明可以屏蔽命名
空间的某些成员名字,局部变量k屏蔽命名空间名字GameCollegeLib::k,在manip内部对k的引用没有二义性,它引用局部变量k。
命名空间中的名字可能会与外围作用域中定义的其他名字冲突。例如,对manip而言,GameCollegeLib命名空间的成员j看来好像声明在全局作用域中,但是,全局作用域存在另一名为j的对象。这种冲突是允许的,但为了使用该名字,必须显示指出想要的是哪个版本,因此,在manip内部的j使用是有二义性的:该名字既可引用全局变量又可引用命名空间 GameCollegeLib的成员。
为了使用像j这样的名字,必须使用作用域操作符指出想要的是哪个名字。可以编写 ::j 来获得在全局作用域中定义的变量,要使用GameCollegeLib中定义的j,必须使用它的限定名字GameCollegeLib::j。
“using指示”注入来自一个命名空间的所有名字,它的使用是不可靠的:只用一个语句,命名空间的所有成员名就突然可见了。虽然这种方法看似简单,但也有它自身的问题。如果应用程序使用许多库,并且用“using指示”使得这些库中的名字可见,那么,全局命名空间污染问题就会重新出现。
1.2 异常处理在C++中的实现
1.2.1 异常处理的概念和使用条件
程序运行中的某些错误(或意外情况)不可避免但可以预料。例如,假设y变量是一个除法运算或者模运算的除数,那么当变量y为0时,是一种严重的错误(即出现异常),需要得到处理并将错误反馈给设计者,可以在程序中添加如下形式的测试语句来达到这样的目的:
if(y == 0){
std::cout << “Error occuring--Divided by 0!”;exit(1);} 若出现y值为0的情况,则用户程序将进行干预,比如先在屏幕上给出适当的错误提示信息,然后退出程序停止运行等。这种处理工作本质上就是异常处理。从这里可以看出,异常处理就是从发生异常情况的地方停止,不再进行正常的程序流程,而是转而执行特定的异常处理流程。
1.2.2 异常处理的实现
C++中提供的对异常进行处理的机制,那就是在程序中使用try、catch和throw。
【实例1-4】在函数中使用异常机制
请看如下程序,其中使用了try、catch和throw来对除以0或模0所产生的异常进行处理。程序要求输入两个整数i1、i2以及一个运算符op(“/”或者“%”),而后进行相应运算并对所出现的异常进行处理。
#include
using std::cout;using std::cin;using std::endl;
void main(){
try
{
// try 程序块为“受监控”的块,块中所抛出的异常
// 将被本try块后的某一个catch块所捕获并处理
int i1, i2;
char op;
cout << “Input I1 I2 OP:”;
cin >> i1 >> i2 >>op;// 输入两个整数i1、i2 以及一个运算符op
if(op == '/')
{
// 分母为0 时,抛出一个字符串:char*类型的异常
// 所抛出的异常将被随后的catch块捕获并处理
if(i2 == 0)
throw “Divided by 0!”;
// 正常情况(分母非0)的处理
cout << i1 << “ / ” << i2 << '=' << i1/i2 << endl;
}
else if(op == '%')// 限制op只能为“/”或者“%”
{ // 分母为0 时,抛出整数i1 — int 型异常 // 所抛出的异常将被随后的catch 块捕获并处理
if(i2==0)
throw i1;
cout << i1 << “ % ” << i2 << '=' << i1 % i2 << endl;// 正常情况处理
}
else
cout<<“OP error--must be '/' or '%'!”< // 再进行一些其他的处理 cout << “22 / 5=” << 22 / 5 << endl; } catch(int i) { // 捕获“int”类型的异常并进行处理 // 输出相关的异常信息后结束本catch块 cout << “Error occuring--” << i << “ % 0 ” << endl; } catch(char *str) // 捕获“char *”类型的异常并进行处理 { // 输出相关的异常信息后结束本catch块 cout<<“Error occuring--”< } // 异常处理结束后,均转到此处执行该语句 cout<<“End main function!”< Input I1 I2 OP:33 5 % 33 % 5=3 22 / 5=4 End main function!再次运行,显示结果为: Input I1 I2 OP:33 0 / Error occuring--Divided by 0!End main function!注意:通过throw抛出异常后,系统将跳转到与所抛出的实参(表达式)类型完全匹配的catch块去执行,而执行完catch块后将不再返回,继而转到catch块序列的最后一个catch 块的下一语句处去执行。 对实际问题进行处理的程序中,还会碰到多种多样的产生异常(或错误)的情况。例如,磁盘中的文件被移动或缺少所需文件时将导致无法打开,内存不足使得通过new无法获取所需要的动态空间,用户提供了不恰当的输入数据等。为使程序具有更好的容错能力并体现出程序的健壮性,设计程序时,应该充分考虑程序执行过程中可能发生的各种意外情况(即异常),并对它们进行恰当的处理。也就是说,当异常出现后,要尽可能地让用户程序来进行干预,排除错误(至少给出适当的错误提示信息),而后继续运行程序。 下面对try、catch和throw的功能及其使用时要注意的内容做进一步说明: 1) 通过try可构成try块,用于标记运行时可能出现异常的程序代码。也就是说,try程序块在运行时将成为“受监控”的代码块,其中所抛出的任何异常(包括:在try 块中直接抛出的异常,以及通过所调用的“下层”函数而间接抛出的各种异常)都将被捕获并处理。 注意:抛出异常是通过throw 语句来完成的。try 块的使用格式如下: try { //“受监控”的语句序列(通常包含抛出异常的throw 语句)} 2) 通过catch可构成所谓的catch块,它紧跟在try块的后面,用于监视并捕获运行时可能出现的某一种类(类型)的异常并对此种异常进行具体的处理(处理程序代码包含在catch块之中)。即catch程序块将监视并捕获处理程序异常,若没有异常出现的话,catch程序块将不被执行。若准备处理多种类型的异常,要同时给出一个连续的catch块序列,届时系统将通过按序逐一“比对”所抛出的异常类型(既可是系统预定义的基本类型,也可是用户自定义的某种类型)来确定执行该catch块序列中的哪一块。 catch 块的使用格式如下: catch(/*欲捕获的异常类型及形参名字*/){ //对该类型异常的具体处理语句序列 } 注意:如果catch块的具体处理语句序列中根本不使用形参(对应值)的话,则catch块首括号中可以只给出一个异常类型而不必给出形参名字。另外,还允许在catch块首括号中仅写上3 个点符号, 即“catch(…)”,其使用含义为:该catch块将捕获任何类型的异常。也就是说,它与任何一种异常类型都可以匹配成功。若使用这种catch块的话,它应该是catch块序列的最后一块,否则,其后的所有catch块都将起不到任何作用(永远不会被“匹配”成功。因为系统是按序与catch块序列中的每一块逐一进行“对比”的)。 抛出异常的throw语句的使用格式为: throw 表达式 通常使用“表达式”的特殊情况,例如,一个变量或对象、一个常量或字符串等。系统将根据表达式的值类型来与各catch块首括号中形参的异常类型进行“比对”,若“匹配”成功(要求类型完全一致,系统并不自动进行类型转换),则跳转到那一catch块去执行,即进行相应的异常处理。若所有匹配都不成功,则将自动去执行一个隐含的系统函数“abort()”来终止整个程序的运行。 更确切地说,throw语句将把运行时遇到的异常事件信息通知给相匹配的异常处理catch块代码(throw后的“<表达式>”,实际上起着实参的作用,它代表的正是异常事件信息,而catch块首括号中设立的正是所对应的形参。与函数调用类似,通过throw抛出异常后,也同样有一个实参与形参相结合的过程,形参与实参结合后,catch块中处理的实际上是throw语句所提供的实参信息。但与函数调用不同的是,函数调用完成后仍要返回到调用处继续执行,而throw语句所进行的“调用”实际上是带有实参的跳转,跳转到的目标是形参和实参完全匹配的一个catch块,而执行完catch块后将不再返回,继而转到catch块序列的最后一个catch块的下一语句处去执行。另外注意,catch块必须有且仅有一个形参的说明(可以缺少形参名字,但不可以缺少其类型),throw语句后携带的也只是一个相对应的实参(表达式)。 1.3 多级多层捕获与处理机制 1.3.1 多级多层处理的机制 在程序中的层次级别指的是函数间的层层调用关系。在这个调用中被调函数抛出异常,而被主调函数捕获,那么这种情况下的异常处理就称为是多级多层处理。C++的异常处理中是允许处理多级多层情况的。具体如下: 1)允许抛出异常的语句处于捕获与处理异常的catch块所在函数的“下属层次”,例如,可以在主调函数中处理异常,而在被调函数中抛出异常。也就是说,若在本层次的函数中无法处理所抛出的异常的话,系统总会自动沿着“调用链”一直向上传递异常。系统将首先找到异常抛出句throw 所处函数的“父辈”函数,进一步可能又要去找其“祖辈”函数。 【实例1-5】多层间的异常处理 #include int nExc = 0; unsigned short sProduct = sNum1 * sNum2; // 当结果超出数据表达范围时就抛出异常 if(sProduct < sNum1 || sProduct < sNum2) { throw nExc; } else { } int main(){ unsigned short s1 = 50000, s2 = 40000; unsigned short sProduct; try { sProduct = numMul(s1, s2); printf(“乘积=%dn”, sProduct);catch(int nExc){ printf(“错误代码为:%dn”, nExc); } return 0;} return sProduct; } } 程序运行,结果如下: 错误代码为:0 2)允许在同一程序中使用多个try块,而且这些try块可以处于不同的位置并具有不同的层次级别。抛出异常后,系统将首先在相应的低层次级别的try块后的catch块序列中寻找匹配,若不成功,将自动沿着“调用链”向上传递该异常,并在上一层次的try块后的catch块序列中继续寻找匹配。直到最终匹配成功,或者已到达了最高层次的main函数后仍不成功时,则自动调用系统隐含函数“abort()”来终止整个程序的运行。 改写上例中的main()函数,对于抛出的异常不做处理。 #include unsigned short s1 = 50000, s2 = 40000; unsigned short sProduct; sProduct = numMul(s1, s2); printf(“乘积=%dn”, sProduct); return 0;} 程序运行后,系统报错后结束。 1.3.2 多级多层处理的综合实例 【实例1-6】对用户提供不恰当输入数据的异常进行处理 输入一个限定范围内的整数,若输入数据不处于限定范围之内时,则视为程序运行异常,而后抛出并捕获处理这些异常。若输入正确,则在屏幕上显示出所输入的整数。另外,在程序中自定义一个异常类myExcepCla,以方便对异常的处理。 对输入数据所限定的范围如下:只允许输入-50~50之间除去0、11与22之外的那些整数。具体对异常的处理设定为: 若输入值为0,则抛出一个“char*”类异常 — 显示“main-catch::Exception : value equal 0!”; 若输入值小于-50,则抛出一个自定义类myExcepCla异常 — 显示“main-catch::Exception : value less than-50!”; 若输入值大于50,则抛出一个“char*”类异常 — 显示“InData-catch::Exception : value greater than 50!”; 若输入值为11,则利用输入值抛出一个int 型异常 — 显示“InData-catch::Caught INT exception!i=11”; 若输入值为22,则抛出一个double型异常 — 显示“main-catch::Caught unknown exception!”。 要求程序使用两个try块,一个处于main函数中,而另一个则处于被main函数调用的InData函数之中,它们具有不同的位置并具有不同的层次级别。main函数中try块后的catch块序列捕获并处理“char*”、myExcepCla以及“其他”任何类型的异常;而InData函数中try块后的catch 块序列则捕获并处理int与“char*”类型的异常。 #include { char message[100];public: // 构造函数,实参带来私有字符串数据message myExcepCla(char* msg) { strcpy(message, msg); } // 成员函数,获取私有数据message字符串 char* GetErrMsg() { return message; } };void InData();//函数声明 void main(){ // 处于main中的try程序块,它为“受监控”的程序块 try { InData();// 调用自定义函数InData,其中可能抛出异常 cout << “End try block!” << endl; } catch(char * str)// 捕获“char *”类型的异常并进行处理 { cout << “main-catch::” << str << endl; } catch(myExcepCla ob) { // 捕获“myExcepCla”类型的异常并进行处理 cout << “main-catch::” << ob.GetErrMsg()<< endl; } catch(...) { // 捕获“其他”任何异常并进行处理 cout << “main-catch::” << “Caught unknown exception!” << endl; } // 本层次的某个异常处理结束后,// 均转到此处执行该语句 cout << “End main function!” << endl;} void f(int val){ // 自定义函数f,负责判断val 是否为11 或22,// 输入值为11,抛出一个int 型异常 if(val == 11) throw val; // 输入值为22,抛出一个double型异常 if(val == 22) throw 123.86;} 注意:f中所抛出的int型异常,将首先被自动沿着“调用链”向上传递到其“父辈”函数InData,而在InData中的catch块序列中,该异常恰好被匹配成功而得到处理。f中所抛出的double型异常,首先也被自动沿着“调用链”向上传递到其“父辈”函数InData,而在InData中的catch块序列中无法匹配成功又进一步被传递到其“祖辈”函数main,在main中与“catch(...)”匹配成功而得到处理。 void InData(){ int val; cout << “Input a INTEGER(from-50--50, excpt 0、11、22):”; cin >> val; if(val == 0)// 若输入值等于0,抛出“char*”类异常,在main中被捕获处理。 throw “Exception : value equal 0!”; try { // 处于InData中的try程序块,它为“受监控”的另一个程序块 if(val<-50) { myExcepCla exc(“Exception : value less than-50!”); // 该异常将被main中try 后的“catch(myExcepCla ob)” // 所捕获处理 throw exc; } if(val > 50) throw “Exception : value greater than 50!”;// 在本try 后的catch 块序列中被捕获处理 else f(val);// 被调函数f 中可能抛出异常 cout << “OK!value=” << val << endl;//不发生异常时,屏幕显示出输入值val } // 捕获“int”类型的异常并进行处理 catch(int i) { cout << “InData-catch::” << “Caught INT exception!i =” << i << endl; } // 捕获“char *”类型的异常并进行处理 catch(char * str) { cout << “InData-catch::” << str << endl; } } 注意:InData函数中try块后的某一个catch块被执行后(异常被处理结束后),将结束InData函数,返回到其主调函数main的try程序块的InData函数调用语句的下一语句处,即将接着去执行main中的“cout<<“End try block!”< 显示结果为: Input a INTEGER(from-50--50, excpt 0、11、22):0 main-catch::Exception : value equal 0!End main function!第二次执行: Input a INTEGER(from-50--50, excpt 0、11、22):88 InData-catch::Exception : value greater than 50!End try block!End main function!第三次执行: Input a INTEGER(from-50--50, excpt 0、11、22):50 OK!value=50 End try block!End main function!本实例程序中使用了两个try块,一个处于main函数中,而另一个则处于被main函数调用的InData函数之中,它们具有不同的位置并具有不同的层次级别。抛出异常后,系统总是首先在相应的低层次级别(如本例的InData函数)的try块后的catch块序列中寻找匹配,若不成功,再自动沿着“调用链”向上传递该异常,并在上一层次(如本例的main函数)的try块后的catch块序列中继续寻找匹配。 另一个注意点是:若程序中含有多个不同位置并具有不同层次级别的try块时,一旦异常被某一个层次的catch块所捕获,在执行完那一catch块后,系统的继续运行“点”将是本层次catch块序列之最后一个catch块的下一语句处(若那里不再有其他语句时,则结束那一函数而返回到上一层次的主调函数中)。 本程序还自定义了一个异常类myExcepCla,通过对它的使用,可建立起一种对异常进行处理的统一模式。 1.4 异常处理中的堆栈展开 C++进行异常处理时,总要自动地进行如下所述的一个“堆栈展开”过程:每当抛出一个异常后,系统首先找到能捕获处理该异常的catch块(注意,其中可能自动沿着“调用链”多次向上传递该异常,并假定在某一层次的try块后的catch块序列中找到了相匹配的catch块),紧接着系统要利用所抛出的对象(throw句中的“实参”)对相应catch块的“形参”进行“初始化”,而后将立即检查从抛出异常的那一try块的块首到该异常被抛出之间已构造,但尚未析构的那些处于堆栈中的局部对象(与变量)。若有,系统将自动对这些局部对象进行相应的退栈与析构处理(通过自动调用各对象的析构函数来完成,析构对象的顺序与构造它们的顺序恰好相反),再去执行相应catch块中的代码完成对异常的处理。 系统之所以要这样做,是因为异常处理机制中,通过throw语句抛出异常后,系统实际上是要找到并“跳转”到捕获异常的catch块去执行,而且在执行完那一catch块后将不再返回(到throw语句之后),继而转到catch块序列的最后一个catch块的“下一语句”处去执行。正是由于这种“跳转”后的不再返回,当抛出异常的throw语句处于某一下属层次的局部作用域(如某个局部块作用域或某个函数作用域)之中时,throw的“跳转”实际上相当于跳出了那些作用域,所以系统将自动检查在那些作用域中已经构造但尚未析构的处于堆栈中的局部对象(与变量),并自动进行相应的退栈与析构处理。 【实例1-7】分析以下程序执行后会显示出什么结果 注意系统对局部块作用域中的局部对象ob1和ob2所进行的自动析构处理。程序中说明了一个具有显式构造函数和析构函数的自定义类ClaA,并在其中显示目前已经进入该构造函数或析构函数的提示信息(因为要通过输出信息来观察系统提供的自动析构处理功能)。 编写main函数,并在其中设置局部块作用域,且说明ClaA自定义类的局部对象ob1和ob2,之后通过抛出“char*”类型的异常“跳转”出该局部块作用域(此时系统将对局部对象进行自动析构处理)。 由于要抛出并处理异常,将main中的程序段置于try块的块体之中,并添加捕获“char*”类型异常的catch块。 本实例的重点在于了解异常处理过程中的“堆栈展开”,以及对象的自动析构处理功能。 #include using std::cout;using std::cin; using std::endl; class ClaA { }; void main(){ } // 捕获“char *”类型的异常并进行处理 catch(char * str){ } cout<<“After throw, in block-statement!End block-statement!”< throw “throwing 'char*' exception in block-statement!”;cout << “Throwing exception, in block-statement!” << endl;// 局部于块的对象ob1和ob2 均被分配在系统的堆栈中 ClaA ob1(“ob1”), ob2(“ob2”);cout<<“Begin main function!”< // try 程序块为“受监控”的程序块 cout << “Enter try-block!” << endl;// 定义一个局部块作用域 { cout << “Begin a block-statement!” << endl;~ClaA(){ } cout << “Destructing ClaA obj--” << s << endl;ClaA(char * str){ } cout << “Constructing ClaA obj--” << str << endl;strcpy(s, str);char s[100];public: } } cout<<“Execution resumes here.End main function!”< cout<<“In catch-block, deal with: ”< Begin main function!Enter try-block!Begin a block-statement!Constructing ClaA obj--ob1 Constructing ClaA obj--ob2 Throwing exception, in block-statement!Destructing ClaA obj--ob2 Destructing ClaA obj--ob1 In catch-block, deal with: throwing 'char*' exception in block-statement!Execution resumes here.End main function!注意:上一程序中,抛出异常的throw语句处于一个局部块作用域内,throw的“跳转”实际上相当于跳出了那个局部块作用域(“跳转”到相对应的那一catch块而不再返回),所以系统将自动检查在那一局部块作用域中已经构造,但尚未析构的处于堆栈中的局部对象。如本例的ob1和ob2,并自动对它们进行相应的退栈与析构处理(析构顺序为ob2而后是ob1)。 实际上,当抛出异常的throw语句处于下属层次的某个函数作用域之中时,throw的“跳转”就相当于跳出了那个函数作用域(而不再返回),那时系统同样也将自动检查在哪一函数作用域中已经构造,但尚未析构的处于堆栈中的局部对象,并自动进行相应的退栈与析构处理。 例如,若将本例程序main函数中的try块改写为: try { cout << “Enter try-block, calling fun!” << endl;fun();} 在程序中添加如下形式的一个fun函数的话,则系统会自动对ob1与ob2进行相应的退栈与析构处理,大家可作为一个练习去完成,并上机进行调试验证。 void fun(){ cout << “Begin fun!” << endl; ClaA ob1(“obj1”), obj2(“ob2”); cout << “Throwing exception, in fun!” << endl; throw “throwing 'char*' exception in fun!”; cout << “After throw, in fun!End fun!” << endl;} 注意:fun 函数中所抛出的异常,是由其主调函数main 处的catch块所捕获并处理的。本章小结 本章介绍了命名空间概念,如何使用命名空间解决名字冲突问题。如何定义命名空间以及如何使用命名空间成员。在进行复杂系统设计过程中,名字冲突问题是不可避免的,命名空间技术可以很好的解决此类问题。嵌套命名空间可以防止库中每个部分的名字与库中其他部分的名字冲突的问题。对于命名空间的访问有“using声明”、“命名空间别名”、“using 指示”等方法。由于“using指示”使得命名空间中的名字暴露在全局区域中,所以要尽量避免使用。本章还介绍了C++中的异常处理,C++中采用异常处理机制的原因和实现方法,以及实际程序设计时会遇到多层级异常处理的问题。此外还介绍了C++中异常处理时的堆栈操作,使大家更能了解异常处理对程序稳定性的影响,并掌握在程序中使用异常处理的方法,从而使大家设计的程序更加健壮。 自测习题 判断试题 1.当程序中产生异常时,程序一定会被强制结束。()2.异常只在try块中产生,在非try块中不会产生。() 3. 在catch块首括号中仅写上3个点符号,即catch(„)时此块不处理任何异常。()4.若try块后找不到相应的catch块来处理异常,则程序将忽略这个异常继续运行。()5.在同一程序中,try块的数量一定和catch块的数量一样多。()问答题 6.解释using声明和using指示符的区别。7.考虑下面的代码例子: namespace Exercise { } int ivar = 0;//1 int ivar = 0;double dvar = 0;const int limit = 1000; void manip(){ //2 double dvar = 3.1416;int iobj = limit + 1;++ivar;++::ivar;} 如果将命名空间Exercise成员的using声明放在 //1 处那么会对代码中的声明和表达式有什么影响?如果放在 //2 处呢?当用using指示符代替命名空间Exercise的using声明时,答案又是什么? 课后作业 1.输入一组数,实现一个累加和函数,当累加和超过数据的表示范围时,产生异常。2.在自己项目中定义自己命名空间,并分别用using声明、命名空间别名、using指示对命名空间成员进行引用。 System 命名空间 类 Activator 包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。 AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境。不能继承此类。AppDomainSetup 表示可以添加到 AppDomain 的实例的程序集绑定信息。 AppDomainUnloadedException 在尝试访问已卸载的应用程序域时引发的异常。ApplicationException 发生非致命应用程序错误时引发的异常。ArgumentException 在向方法提供的其中一个参数无效时引发的异常。 ArgumentNullException 当将空引用(在 Visual Basic 中为 Nothing)传递给不接受它作为有效参数的方法时引发的异常。 ArgumentOutOfRangeException 当参数值超出调用的方法所定义的允许取值范围时引发的异常。 ArithmeticException 因算术运算、类型转换或转换操作中的错误而引发的异常。 Array 提供创建、操作、搜索和排序数组的方法,因而在公共语言运行库中用作所有数组的基类。 ArrayTypeMismatchException 当试图在数组中存储类型不正确的元素时引发的异常。AssemblyLoadEventArgs 为 AssemblyLoad 事件提供数据。Attribute 自定义属性的基类。 AttributeUsageAttribute 指定另一特性类的用法。无法继承此类。 BadImageFormatException 当 DLL 或可执行程序的文件图像无效时引发的异常。BitConverter 将基础数据类型与字节数组相互转换。Buffer 操作基元类型的数组。 CannotUnloadAppDomainException 卸载应用程序域的尝试失败时引发的异常。CharEnumerator 支持循环访问 String 并读取它的各个字符。 CLSCompliantAttribute 指示程序元素是否符合公共语言规范(CLS)。无法继承此类。Console 表示控制台应用程序的标准输入流、输出流和错误流。无法继承此类。ContextBoundObject 定义所有上下文绑定类的基类。 ContextMarshalException 在尝试将对象封送过上下文边界失败时引发的异常。ContextStaticAttribute 指示静态字段的值是特定上下文的唯一值。Convert 将一个基本数据类型转换为另一个基本数据类型。DBNull 表示空值。Delegate 表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。DivideByZeroException 试图用零除整数值或十进制数值时引发的异常。 DllNotFoundException 当未找到在 DLL 导入中指定的 DLL 时所引发的异常。 DuplicateWaitObjectException 当对象在同步对象数组中不止一次出现时引发的异常。EntryPointNotFoundException 因不存在项方法而导致加载类的尝试失败时引发的异常。Enum 为枚举提供基类。 Environment 提供有关当前环境和平台的信息以及操作它们的方法。不能继承此类。EventArgs EventArgs 是包含事件数据的类的基类。Exception 表示在应用程序执行期间发生的错误。 ExecutionEngineException 当公共语言运行库的执行引擎中发生内部错误时引发的异常。无法继承此类。 FieldAccessException 当试图非法访问类中的私有字段或受保护字段时引发的异常。FlagsAttribute 指示可以将枚举作为位域(即一组标志)处理。 FormatException 当参数格式不符合调用的方法的参数规范时引发的异常。GC 控制系统垃圾回收器(一种自动回收未使用内存的服务)。 IndexOutOfRangeException 试图访问索引超出数组界限的数组元素时引发的异常。无法继承此类。 InvalidCastException 因无效类型转换或显式转换引发的异常。 InvalidOperationException 当方法调用对于对象的当前状态无效时引发的异常。 InvalidProgramException 当程序包含无效 Microsoft 中间语言(MSIL)或元数据时将引发的异常。通常这表示编译器中出现错误。 LoaderOptimizationAttribute 用于为可执行应用程序的主方法设置默认的加载程序优化策略。LocalDataStoreSlot 封装内存槽以存储本地数据。无法继承此类。 MarshalByRefObject 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。Math 为三角函数、对数函数和其他通用数学函数提供常数和静态方法。MemberAccessException 访问类成员的尝试失败时引发的异常。 MethodAccessException非法尝试访问类中的私有方法或受保护的方法时引发的异常。MissingFieldException 试图动态访问不存在的字段时引发的异常。 MissingMemberException 试图动态访问不存在的类成员时引发的异常。MissingMethodException 试图动态访问不存在的方法时引发的异常。 MTAThreadAttribute 指示应用程序的 COM 线程模型为多线程单元(MTA)。 MulticastDelegate 表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。 MulticastNotSupportedException 当试图合并不可合并的委托类型的两个实例时引发的异常,除非操作数中有一个是空引用(在 Visual Basic 中为 Nothing)。无法继承此类。NonSerializedAttribute 指示可序列化类的某个字段不应被序列化。无法继承此类。 NotFiniteNumberException 当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。 NotImplementedException 在无法实现请求的方法或操作时引发的异常。NotSupportedException 当调用的方法不受支持,或试图读取、查找或写入不支持调用功能的流时引发的异常。 NullReferenceException 尝试取消引用空对象引用时引发的异常。 Object 支持.NET Framework 类层次结构中的所有类,并为派生类提供低级别服务。这是.NET Framework 中所有类的最终基类;它是类型层次结构的根。ObjectDisposedException 对已处置的对象执行操作时所引发的异常。ObsoleteAttribute 标记不再使用的程序元素。无法继承此类。 OperatingSystem 表示有关操作系统的信息,如版本和平台标识符。OutOfMemoryException 没有足够的内存继续执行程序时引发的异常。OverflowException 在选中的上下文中所进行的算术运算、类型转换或转换操作导致溢出时引发的异常。 ParamArrayAttribute 指示方法在调用中将允许参数的数目可变。无法继承此类。PlatformNotSupportedException 当功能未在特定平台上运行时所引发的异常。 Random 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。RankException 将维数错误的数组传递给方法时引发的异常。 ResolveEventArgs 为 TypeResolve、ResourceResolve 和 AssemblyResolve 事件提供数据。SerializableAttribute 指示一个类可以序列化。无法继承此类。StackOverflowException 挂起的方法调用过多而导致执行堆栈溢出时引发的异常。无法继承此类。 STAThreadAttribute 指示应用程序的 COM 线程模型是单线程单元(STA)。String 表示文本,即一连串 Unicode 字符。 SystemException 为 System 命名空间中的预定义异常定义基类。ThreadStaticAttribute 指示静态字段的值对于每个线程都是唯一的。TimeZone 表示时区。Type 表示类型声明:类类型、接口类型、数组类型、值类型和枚举类型。 TypeInitializationException 作为由类初始值设定项引发的异常周围的包装引发的异常。无法继承此类。 TypeLoadException 类型加载失败发生时引发的异常。TypeUnloadedException 试图访问已卸载的类时引发的异常。 UnauthorizedAccessException 当操作系统因 I/O 错误或指定类型的安全错误而拒绝访问时所引发的异常。 UnhandledExceptionEventArgs 为以下情况下引发的事件提供数据:存在一个不是由应用程序域处理的异常。 Uri 提供统一资源标识符(URI)的对象表示形式和对 URI 各部分的轻松访问。 UriBuilder 为统一资源标识符(URI)提供自定义构造函数,并修改 Uri 类的 URI。UriFormatException 当检测到无效的统一资源标识符(URI)时引发的异常。ValueType 提供值类型的基类。 Version 表示公共语言运行库程序集的版本号。无法继承此类。WeakReference 表示“弱引用”,即在引用对象的同时仍然允许对该对象进行垃圾回收。接口 IAppDomainSetup 表示可以添加到 AppDomain 的实例的程序集绑定信息。IAsyncResult 表示异步操作的状态。 ICloneable 支持克隆,即用与现有实例相同的值创建类的新实例。 IComparable 定义通用的比较方法,由值类型或类实现以创建类型特定的比较方法。IConvertible 定义特定的方法,这些方法将实现引用或值类型的值转换为具有等效值的公共语言运行库类型。 ICustomFormatter 定义一种方法,它支持对象值的自定义(用户定义)格式设置。IDisposable 定义一种释放分配的非托管资源的方法。IFormatProvider 提供用于检索控制格式化的对象的机制。IFormattable 提供将对象的值格式化为字符串表示形式的功能。IServiceProvider 定义一种检索服务对象的机制,服务对象是为其他对象提供自定义支持的对象。 _AppDomain 表示应用程序域,它是一个应用程序在其中执行的独立环境。结构 ArgIterator 表示变长参数列表;即采用可变数量的参数的函数的参数。Boolean 表示布尔值。 Byte 表示一个 8 位无符号整数。Char 表示一个 Unicode 字符。DateTime 表示时间上的一刻,通常以日期和当天的时间表示。Decimal 表示十进制数。 Double 表示一个双精度浮点数字。Guid 表示全局唯一标识符(GUID)。Int16 表示 16 位有符号的整数。Int32 表示 32 位有符号的整数。Int64 表示 64 位有符号的整数。 IntPtr 用于表示指针或句柄的平台特定类型。RuntimeArgumentHandle 引用变长参数列表。 RuntimeFieldHandle 使用内部元数据标记表示一个字段。 RuntimeMethodHandle RuntimeMethodHandle 是方法的内部元数据表示形式的句柄。RuntimeTypeHandle 表示使用内部元数据标记的类型。SByte 表示 8 位有符号整数。Single 表示一个单精度浮点数字。TimeSpan 表示一个时间间隔。 TypedReference 描述既包含指向某位置的托管指针,也包含该位置可能存储的类型的运行时表示形式的对象。 UInt16 表示 16 位无符号整数。UInt32 表示 32 位无符号整数。UInt64 表示 64 位无符号整数。 UIntPtr 用于表示指针或句柄的平台特定类型。 Void 指示不返回值的方法,即具有 void 返回类型的方法。委托 AssemblyLoadEventHandler 表示处理 AppDomain 的 AssemblyLoad 事件的方法。AsyncCallback 引用在异步操作完成时调用的回调方法。 CrossAppDomainDelegate 由 DoCallBack 使用,用于跨应用程序域的调用。EventHandler 表示将处理不包含事件数据的事件的方法。 ResolveEventHandler 表示处理 AppDomain 的 TypeResolve、ResourceResolve 和 AssemblyResolve 事件的方法。 UnhandledExceptionEventHandler表示将处理事件的方法,该事件由应用程序域不处理的异常引发。枚举 AttributeTargets 指定可以对它们应用特性的应用程序元素。DayOfWeek 指定一周的某天。 Environment.SpecialFolder 指定用于检索系统特殊文件夹的目录路径的枚举常数。LoaderOptimization 一个枚举,它与 LoaderOptimizationAttribute 类一起使用为可执行文件指定加载程序优化。 PlatformID 描述程序集所支持的平台。TypeCode 指定对象的类型。 UriHostNameType 为 Uri.CheckHostName 方法定义主机名类型。UriPartial 为 Uri.GetLeftPart 方法定义 URI 的各部分。 使用DFS创建命名空间 如果想把零散的共享资源组织起来,可以使用DFS创建命名空间。以下是win7之家所介绍的建命名空间的步骤。 步骤1:打开【DFS管理】窗口,右击【命名空间】结点,执行【新建命名空间】命令,如下图所示。 新建命名空间 步骤2:windows7系统下载弹出【新建命名空间向导】对话框,根据向导提示填写相关的信息,即可顺利地新建命名空间。 分布式文件系统命名空间解析 近年,微软对其分布式文件系统(Distributed File System,DFS)做了很多改良,其中的一项技术对文件系统资源提供了统一视图。DFS重新定向了来自UNC途径的请求,其中一个网络驱动映射到请求资源所在的网络共享。这样的结果是你可以添加文件服务器到网络或者不用影响用户访问文件的方式就能强化现有的文件服务器。重定向请求到文件实际位置的UNC途径就是DFS命名空间。本质上,DFS命名空间是为用户呈现文件服务器资源集中化视图的统一命名空间。一个DFS命名空间由很多部分组成。DFS根DFS命名空间本质上是分等级的,最顶端的是DFS根。在实际运用中,可以认为根和命名空间是一样的,因为根常用来指代整个命名空间。DFS根是一个共享文件,它必须存在于NTFS卷中。DFS根链接到一个或多个根目标,而根目标则链接到一个文件服务器上的UNC共享。一个DFS根可以链接的根目标数量由DFS根相关的命名空间类型决定。DFS命名空间有两个类型:独立命名空间和基于域的命名空间。独立命名空间存储他们在主机服务器注册表中的配置信息。基于域的命名空间存储在活动目录数据库中的信息。这个区别影响连接到DFS根的根目标数量。独立DFS根只能包含一个单一根目标,而基于域的DFS根只包含通过多个服务器分离的多个根目标。下面的图1展示了一个基于域的DFS根。很明显这是基于域的,因为这个根的名字(//lab.com/namespace)反映了域的名字。中心方格显示两个UNC途径,并且两个途径都像根目标一样链接到DFS根。图1:DFS根连接到一个或多个根目标DFS命名空间里的文件或链接在分级中的下一个元素是文件或链接(正如它有时候所指的)。在DFS命名空间中的每个文件都映射到链接目标,正如DFS根映射到根目标。链接目标指向一个映射到物理文件夹的UNC共享。在图2 中,三个文件(文件 1、文件2和文件3)都被定义在DFS根下(注意,我已经选了文件1)。控制台的中央窗口列出了映射到文件的链接目标。图2:每个文件都映射到链接目标如你所见,这个链接目标不过是一个映射到共享文件的UNC途径。另外要注意,在控制台的中央窗口中,为链接目标展示了各种各样的信息,包括类型、途径和提交状态。由于一个文件可以和不同服务器上的多个链接目标连接,所以提交状态存在。这样做了之后,你可以为链接目标创建一个复制组,且复制组会保持多种文件内容与其它文件之间的同步。图3展示的就是一个有多个链接目标的文件。图3:多个链接目标两个链接目标的提交状态都是有效的(Enabled)。这意味着DFS可以向任意一个目标指定资源请求。因此,如果一个文件服务器必须离线维修,这个服务器的提交状态就变成无效,而DFS会停止向该服务器发送请求,直到提交状态再次变为有效。NTFS级别的DFS命名空间上述因素组成了DFS命名空间。在图4中,你可以看到NTFS级别的命名空间是什么样子的。图4:驱动C盘上的DFS内容注意名为Dfsroots的文件,它下面的那个文件就叫Namespace(命名空间)。当我创建根时DFS自动创建这些文件。Namespace文件实际上是共享的,但是文件系统隐藏了该共享。最后要注意,在命名空间下面有到文件 1、文件2和文件3的快捷键.这些都是在DFS管理控制台中指定的目标文件。在图的底部是这三个文件夹的另一个列表,它实际上是在驱动C盘上的共享文件。我刚刚提到的快捷键映射到这些共享文件夹。 文 山 金 文 山 丰 产 林 有 限 公 司 W E N S H A N G O L D E N W E N S H A N F O R E S T C O.,LTD.异常案件处理办法(试行) 一目的 本办法旨在规范指引金光纸业在文山丰产林项目公司(简称公司,下同)异常案件的处理,发挥各职能部门的积极性、主动性、能动性,及时、合法、合理、高效处理异常案件,营造有利于林浆纸项目发展的良好氛围,最大限度地维护公司利益。二异常案件含义及主要案件分类界定 本办法所称异常案件系指妨碍林班有效经营管理以及违反国家政策和法律法规,损害公司利益,依法应承担法律责任的案件,包括但不限于:森林火灾、林地林木权属纠纷、盗伐、盗窃、滥伐、破坏生产经营、非法放牧砍柴、滥垦、征地占地、临时占用、非法占地、移动损坏标志、偷采矿产、其他案件(水土流失、病虫害、冻害、水涝、旱灾、风灾、偷采野生植物、偷猎、非法经营木材业等)。 处理异常案件,除提请案件处理行政机关依法追究外,应当努力通过各种方式、循相关渠道取得当地政府、林浆纸(业)部门等党政部门的支援或协助。1 森林火灾 (1)森林火灾系指因各种自然、人为(故意或过失)以及因暂时无法判断之状况发生的林地火灾,云南省一般每年12月1日至次年6月15日,为全省森林防火期。每年3月1日至4月30日为全省森林防火戒严期。(2)森林防火期内,在森林、新造林地内,严禁下列活动和行为: (一)烤蜂、烧山狩猎和使用火药抢狩猎、烤火、烘烤食品和野炊; (二)上坟烧纸、烧香、燃放鞭炮; (三)使用火把照明、吸烟; (四)其他非生产性用火。 (3)森林防火期内,确需在林区、林缘进行生产性用火的,必须经村民委员会(相当于村小组)同意,报村公所(相当于村委会)、办事处(乡镇人民政府派出机构)批准。经批准进行的生产性用火,必须落实防火措施,有专人负责。 炼山造林、烧牧场,必须提前10天报县(市、区)森林消防指挥部批准,发给用火许可证。经批准的野外用火,必须落实消防措施,按批准的时间、范围,在三级风以下的天气进行,由批准机关指定专人监督实施。森林防火戒严期内,在林区内,严禁一切野外用火。 (4)引起森林火灾案件的责任人依法应承担法律责任(行政处罚、赔偿公司损失和追究刑事责任),并先由当地林业局或授权的当地森林公安机关(无森林公安机关的,由地方公安机关管辖,下同)或乡镇林业站查处;构成犯罪的,依法提请追究责任人的刑事责任。2.盗伐(1)指违反森林法及其他森林保护法规,以非法占有为目的,具有下列情形之一,数量较大的行为: (一)擅自砍伐国家、集体、他人所有或者他人承包经营管理的森林或者其他林木,以及擅自砍伐他人自留山上的成片林木; (二)擅自砍伐本单位或者本人承包经营管理的森林或者其他林木; (三)在林木采伐许可证规定的地点以外采伐国家、集体、他人所有或者他人承包经营管理的森林或者其他林木。(2)法律责任 (一)构成行政处罚的规定:不足0.5 M3或幼树不足20株,由县级以上林业主管部门责令补种盗伐株数10倍的树木,没收盗伐的林木或者变卖所得,并处盗伐林木价值3至5倍的罚款;0.5 M3以上或幼树20株以上,责令补种盗伐株数10倍的树木,没收盗伐的林木或者变卖所得,并处盗伐林木价值5至10倍的罚款。 (二)构成犯罪(追究刑事责任)的规定:盗伐森林或者其他林木,数量较大的(2—5M3或幼树100—200株),处三年以下有期徒刑、拘役或者管制,并处或者单处罚金;数量巨大的(20—50 M3或幼树1000—2000株),处三年以上七年以下有期徒刑,并处罚金;数量特别巨大的(100—200 M3或幼树5000—10000株),处七年以上有期徒刑,并处罚金。 (三)对公司造成的损失,责任人应承担赔偿责任。 (四)盗伐案件首先由当地林业局或授权的森林公安机关、乡镇林业站管辖。3.滥伐 (1)指违反森林法及其他保护森林法规,具有下列情形之一,数量较大的行为: (一)未经林业行政主管部门及法律规定的其他主管部门批准并核发林木采伐许可证,或者虽持有林木采伐许可证,但违反林木采伐许可证规定的时间、数量、树种或者方式,任意采伐本单位所有或者本人所有的森林或者其他林木的; (二)超过林木采伐许可证规定的数量采伐他人所有的森林或者其他林木的; (三)林木权属争议一方在林木权属确权之前,擅自砍伐森林或者其他林木的。(2)法律责任 (一)构成行政处罚的规定:滥伐森林或者其他林木,以立木材积计算不足2M3或幼树不足50株的,由县级以上林业主管部门责令补种滥伐株数5倍的树木,并处滥伐林木价值2至3倍的罚款; 2 M3以上或幼树50株以上,以立木材积计算2立方米以上或者幼树50株以上的,由县级以上人民政府林业主管部门责令补种滥伐株数5倍的树木,并处滥伐林木价值3倍至5倍的罚款。 (二)构成犯罪(追究刑事责任)的规定:违反森林法的规定,滥伐森林或者其他林木,数量较大的(10—20M3或幼树500—1000株),处三年以下有期徒刑、拘役或者管制,并处或者单处罚金;数量巨大的(50—100 M3或幼树2500—5000株),处三年以上七年以下有期徒刑,并处罚金。 (三)对公司造成的损失,责任人应承担赔偿责任。 (四)盗伐案件首先由当地林业局或授权的森林公安机关、乡镇林业站管辖。4.权属纠纷 (1)权属纠纷系指因林地林木的所有权或使用权产生的争议。(2)法律规定: (一)单位之间发生的林木、林地所有权和使用权争议,由县级以上人民政府依法处理。 (二)个人之间、个人与单位之间发生的林木所有权和林地使用权争议,由当地县级或者乡级人民政府依法处理。 (三)当事人对人民政府的处理决定不服的,可以在接到通知之日起一个月内,向人民法院起诉。 (四)在林木、林地权属争议解决以前,任何一方不得砍伐有争议的林木。 (3)林班责任人应当随时掌握并报告权属纠纷发生情况,发生权属纠纷(特别是公司给付承包费、已经发包造林的林地)时,采取初步处臵措施后,应当毫无迟延地向公司提报;因权属纠纷引起的各种异常案件均与该案合并提报。 林地权属纠纷发生后,积极协调争议方协商处理,签订协议,协商未成的,为排除对现场作业的干扰因素,建议争议各方先行搁臵争议,交政府部门确权处理,并不得影响我方正常作业。涉及争议地的所得部分提存有关部门或留存我方,待争议处理后,按权属比例或我方原合同约定原则再行给付,根据处理结果对合同作相应变更或补签合同。5.征地占地 (1)征地(包括征收和征用)占地系指勘查、开采矿藏和修建道路、水利、电力、通讯等工程,需占用(相对于国有土地)或征收征用(相对于集体土地)公司林地的按照规定办理审批手续并给予补偿的合法活动。(2)上述工程必须遵守下列规定 (一)用地单位应当向县级以上人民政府林业主管部门提出用地申请(含补偿协议书),经审核同意后,按照国家规定的标准预交森林植被恢复费,领取使用林地审核同意书。用地单位凭使用林地审核同意书依法办理建设用地审批手续。占用或者征用林地未经林业主管部门审核同意的,土地行政主管部门不得受理建设用地申请; (二)占用或者征用防护林林地或者特种用途林林地面积10公顷以上的,用材林、经济林、薪炭林林地及其采伐迹地面积35公顷以上的,其他林地面积70公顷以上的,由国务院林业主管部门审核;占用或者征用林地面积低于上述规定数量的,由省、自治区、直辖市人民政府林业主管部门审核。占用或者征用重点林区的林地的,由国务院林业主管部门审核。 (三)用地单位需要采伐已经批准占用或者征用的林地上的林木时,应当向林地所在地的县级以上地方人民政府林业主管部门或者国务院林业主管部门申请林木采伐许可证。 (3)法律责任:未经批准或者采取欺骗手段骗取批准,非法占用土地的,由县级以上人民政府土地行政主管部门责令退还非法占用的土地,对违反土地利用总体规划擅自将农用地改为建设用地的,限期拆除在非法占用的土地上新建的建筑物和其他设施,恢复土地原状,对符合土地利用总体规划的,没收在非法占用的土地上新建的建筑物和其他设施,可以并处罚款;对非法占用土地单位的直接负责的主管人员和其他直接责任人员,依法给予行政处分;构成犯罪的,依法追究刑事责任。超过批准的数量占用土地,多占的土地以非法占用土地论处。(4)征收征用或占用土地的,公司有权依法获得补偿;征地占地案件由县级以上人民政府土地管理部门处理。 (5)占用公司林地,占用土地人持有征地占地审批文件,未与公司洽商处理或虽有洽商处理但未达成意见的,应取得乡镇人民政府、县林浆纸、县人民政府等部门支持,向乡镇林业站、土地管理部门或县级林业局林政资源部门详细反映、了解情况,提报县级以上土地管理部门处理。6.临时占用 (1)临时占用林地系指临时占用人基于一定需要占用公司林地向县级以上林业行政主管部门申请批准并依法给予公司补偿的活动,一般不超过 两年。 (2)临时占用各类林地的,按照下列规定办理: (一)临时占用用材林、经济林、薪炭林林地面积不满二公顷的,由县级林业行政主管部门审批;二公顷以上不满十公顷的,由地州市林业行政主管部门审批;十公顷以上不满三十五公顷的,由省林业行政主管部门审批;三十五公顷以上的,由省林业行政主管部门审核后报国务院林业行政主管部门审批; (二)临时占用防护林、特种用途林林地面积不满十公顷的,由省林业行政主管部门审批;十公顷以上的,由省林业行政主管部门审核后报国务院林业行政主管部门审批; (三)临时占用其他林地面积不满十公顷的,由县级林业行政主管部门审批;十公顷以上不满三十公顷的,由地州市林业行政主管部门审批;三十公顷以上不满七十公顷的,由省林业行政主管部门审批;七十公顷以上的,由省林业行政主管部门审核后报国务院林业行政主管部门审批。 临时占用林地的单位和个人,应当在使用期满后负责恢复林业生产条件并应当对林地所有者或者经营者进行补偿。(3)办理程序 (一)临时占用单位向林地所在地县级以上人民政府林业主管部门提出用地申请,并送有关材料占用林地的地点、面积、范围的说明及有关资料等。 (二)经林业行政主管部门审核同意后,用地单位与林业主管部门签订临时用地协议书。 (三)按规定支付补偿费。 (四)经批准并交纳费用后,到申请的林业主管部门办理临时占用林地手续。 (4)占用公司林地,占用土地人持有县级以上林业主管部门审批文件,未与公司洽商处理或虽有洽商处理但未达成意见的,提报县级以上林业主管部门处理。7.非法占地 (1)非法占用林地系指未经批准或者采取欺骗手段骗取批准,占用公司林地的行为。 (2)占用公司林地,未与公司洽商处理或虽有洽商处理但未达成意见,初步了解没有发现占用人持有国家有关部门审批文件的,按非法占用案件处理,应取得乡镇人民政府、县林浆纸、县人民政府等部门支持,向乡镇林业站、乡镇土地管理部门或县级林业局林政资源部门详细反映、了解情况,提报县级以上土地管理部门处理。8.破坏生产经营 (1)破坏生产经营系指由于泄愤报复(包括林地林木权属纠纷)或其他个人原因,采用拔苗、破坏林木、损坏林道、集材道、运材道、培育生产种子苗木、贮存种子苗木木材、汽车等林业生产服务设施等方法破坏公司生产经营的行为。等行为。 (2)法律责任:除赔偿公司损失外,由于泄愤报复或者其他个人目的,毁坏机器设备、残害耕畜或者以其他方法破坏生产经营的,处三年以下有期徒刑、拘役或者管制;情节严重的,处三年以上七年以下有期徒刑。 (3)发生该案的,当地乡镇无森林公安机关派出机构的,应当按照就近原则,努力取得当地乡镇政府支持向当地乡镇地方公安机关派出机构提 报调查、采取措施,同时以《异常案件报告表》的形式提报公司处理,当地乡镇设有森林公安机关派出机构的,应直接提报查处。9.放牧砍柴 (1)砍柴放牧系指违反林业法规,在幼林地特种用途林地内 放牧砍柴,致使公司林地受到毁坏的行为;因泄愤报复或权属纠纷等原因,放牧致使公司林地受到毁坏的,按放牧砍柴、权属纠纷与破坏生产经营案件并案处理。 (2)法律责任:在幼林地和特种用途林内砍柴、放牧致使森林、林木受到毁坏的,依法赔偿损失;由林业主管部门责令停止违法行为,补种毁坏株数一倍以上三倍以下的树木。 (3)发生该案的,视情况提报县级林业主管部门或授权的森林公安机关、乡镇林业站查处。10.滥垦 (1)滥垦系指毁林开垦和毁林采石、采沙、采土及其他毁林行为。(2)法律责任:,进行开垦、采石、采砂、采土、采种、采脂和其他活动,致使森林、林木受到毁坏的,依法赔偿损失;由县级林业主管部门责令停止违法行为,补种毁坏株数一倍以上三倍以下的树木,可以处毁坏林木价值一倍以上五倍以下的罚款。(3)该案由县级以上林业主管部门或授权的森林公安机关、乡镇林业站处理。11.偷采矿藏 (1)偷采矿产系指未取得采矿许可擅自采矿的行为。 (2)法律责任:未取得采矿许可证擅自采矿的,责令停止开采、赔偿损失,没收采出的矿产品和违法所得,可以并处罚款;拒不停止开采,造成矿产资源破坏的,依照刑法第一百五十六条的规定对直接责任人员追究刑事责任。 (3)偷采矿产案件由省级人民政府地质矿产主管部门处理,国家有关部门积极配合,该案无论是否取得采矿许可,只要采矿威胁、侵占、毁坏公司林地,未与公司洽商处理或虽有洽商处理但未达成实质意见的,按偷采矿产和非法占地案件并案提报处理。12.移动损坏标志 (1)移动损坏标志系指擅自移动或者毁坏林业服务标志的行为。 (2)法律责任:擅自移动或者毁坏林业服务标志的,由县级以上人民政府林业主管部门责令限期恢复原状;逾期不恢复原状的,由县级以上人民政府林业主管部门代为恢复,所需费用由违法者支付。 (3)该案由县级以上林业主管部门或授权的森林公安机关、乡镇林业站处理。三 依据 根据现行法律法规、结合公司经营实际情况制订本办法。四 适用范围 本办法适用于公司所有异常案件的处理。五 处理部门及其职责 1.公司实行林政部门主导异常案件制度,林政部门的配臵可以在林务部设立,也可以逐级设立,总体负责异常案件的管理、跟踪和督办以及处理机制的拓展;根据案件的性质,法务部门对林政部门和林场处理异常案件进行业务指导和监督。2.林场、林政及法务部门都是处理异常案件的部门,相关部门或人员应密切配合。 (1)对公司生产经营影响不大或涉案标的2000元(含)以下的异常案件一般由林场处理;(2)对公司生产经营影响较大或涉案标的2000元以上的异常案件一般由林政部门处理; (3)对公司生产经营构成重大影响或牵连诉讼和刑事案件的一般由法务部门处理,对牵连法律问题的生产技术性异常案件仅提供法律建议;(4)经公司总(副)经理特别指示交办的案件可不受上述金额、标准限制。 影响是否重大应当从案件是否对林班的有效经营管理构成重大影响、案件的危害程度或持续负面影响、侵权人(次)数、侵害(动机、工具、手段、面积等)、社会关注度等方面综合判定。 3.处理部门必须坚持维护公司整体利益的原则,采取各种措施,积极、切实、高效地处理异常案件,并及时将处理过程或结果反馈至上级部门或主管,上级主管都负有对异常案件处理进行及时组织、领导、协调和支援之责任。六 处理程序及方法 (一)报告 对事后发现或对正在发生的异常案件经林场现场尽职处理后,林场应在发现后48小时内填写《异常案件报告表》(附件1)(情况紧急的立即提报,事后补办),根据《异常案件报告表》规定的程序和权限,报告案件发生和处理情况,由相关部门签署案件处理意见,最后由总经理综合多方意见,形成决策。 《异常案件报告表》中案件发生详细情况栏根据案件性质说明定植时间、平均树高、平均胸径、时间、地点、人物、原因、过程、现场尽职采取了何种措施等,案发时开始,现场责任人应毫无迟延地进行线索摸查,保存有关证据材料,为案件进一步处理提供便利条件。 请求事项可包含对案件合理合法化处理的意见或建议,应尽可能详尽,林场得根据案件性质和本办法规定的原则合理提供具体处理方案和处理部门,以供权责主管参考。 (二)报案 案件承办部门或人员根据立案标准及公司领导决策进行具体事项的操办,对需向政府主管机关报案处理的,应具以书面形式,包括案件发现者、当事人、时间、地点、证人证言、损失情况及对案件的处理请求等基本内容。报案书由林政部门拟制,经法务审核;情况紧急的由林场先口头报案。 1、构成刑事案件的,依法报主管机关查处及追究刑事责任。在公诉机关提起公诉前公司案件承办人员可代表公司与对方当事人对损害赔偿进行和解,也可在追究刑事责任进入诉讼程序后,由我司提出附带民事诉讼,以达成追偿经济损失或持续维护林浆纸基地建设之利益。 2、尚未构成刑事案件的异常案件经总经理批准,依法报政府主管机关查处,同时通报相关单位如当地村委会、林业站。当事人因违反行政管理秩序的行为应当接受行政处罚,如限期恢复原状、罚款、没收违法所得等,同时因该行为而造成我方物质损失的还应承担民事赔偿责任。 (三)处理现场: 1.现场人员对正在实施的不法行为在表明身份时应立即予以制止,可采取合理有效措施以制止不法侵害继续发生和防止损失继续扩大,并及时电话报告上级;在事态难以控制或情况紧急时,应毫无迟延请求当地执法机关依法予以制止、扣留作案工具及扣押有关责任人员,必要时及时请当地村委会、林业站、乡镇政府、森林公安或当地派出所协助处理;相关部门怠于处理的,应毫无迟延地报告相关主管处臵。2.收集有关证据,对现场拍照留存,照片应一底两片,交政府主管机关一份,公司存档一份。 3.现场被政府主管机关确认并请示公司后再进行清理,现场遗留有财产的,在清理前应有人员看守。 (四)跟踪案件处理情况 主要由案件承办人员或指派人员在职权或授权范围内跟踪督促政府主管部门依法办理,并及时向上级报告案情进展情况或请示处理办法。 (五)追偿损失 1.确定损失:以给我方造成的直接实际损失为准。如有评估机构作出的损失评估报告则依之,如没有,则按我方制订的相关规定评估。如因侵权行为造成林地永久流失的,则将我方承包期限内的预计可得利益计入损失范围。 2.追偿时间:从损失确定之日起,案件承办人员就可代表公司对当事人提出具体的索赔要求,每次索赔时应保存有关证据,一般要求有书证,并注意时效性,一般是两年,自知道或应当知道权利被侵害之日起算。 3.追偿损失可先由林场或林政部门与当事人协商,法务部门、财务、总务等相关部门配合,若不能及时取得赔偿或补偿,经公司总经理核准以诉讼方式索赔的,由法务部门处理。 (六)结案 1、经主管机关处理过的侵权人已经得到处理、我方损失得到全额赔偿或持续维护林浆纸基地之利益已达成的案件或已超过诉讼时效、其他长期积压无法处理的案件,由案件承办部门或人员制作《结案报告表》(附件2),并依报批程序逐级呈报到公司总经理决定是否结案。 2、结案后应通知公司相关部门,对原有事实及现场状况需做变更的,由相关部门及时调整,同时通知林场执行处理结果。 3、结案后,整个案件材料应完整归档,作为该林班档案的组成部分,交公司档案部门保管。 七 各异常案件承办部门应定期将待办案件(纯粹技术性的异常案件除外,如病虫害、风害等)汇总报法务部门,法务部门根据案件的性质、进度及难点提出合理化意见和建议,推进案件的解决进度。对于需要诉讼或即将超过诉讼期限的案件,及时进入诉讼程序,或采取有效措施,使诉讼时效得以顺延。 八 公司逐步设立异常案件奖惩办法,以促进异常案件及时有效处理。 凡违反本办法规定,对异常案件负有提报、处理、配合、组织、领导、协调、支援等责任的责任人怠于履行职责,给公司造成较大损失或其他损害的,按照公司有关规定予以处分或依法追究。 九 本办法经权责主管签署生效。 事业区负责人 总(副)经理 审核 拟稿第二篇:C# System命名空间简介
第三篇:使用DFS创建命名空间
第四篇:分布式文件系统命名空间解析
第五篇:异常案件处理办法