当前位置:文档之家› C++处理异常技巧-try,catch,throw,finally

C++处理异常技巧-try,catch,throw,finally

C++处理异常技巧-try,catch,throw,finally
C++处理异常技巧-try,catch,throw,finally

这两天要处理一个异常的问题,刚好查了些相关的资料。在网上看到了一个不错的贴子,就转了过来,方便本人,以及来此旅游的朋友学习。源地址:

https://www.doczj.com/doc/f54005071.html,/Print.html?91983,1

异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。

也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了。

自序:

对写程序来说异常真的是很重要,一个稳健的代码不是靠返回Error

Message/return Value来解决的,可是往往我们从C走过来,习惯了这样的方式。仅以本文献给今天将要来临的流星雨把,还好我能在今天白天把这写完,否则会是第4个通宵了;同时感谢Jeffrey大师,没有他的SEH理论这篇文章只能完成一半,而且所有SEH列子的构想都来自他的指导;另外要感谢Scott Meyers大师,我是看他的书长大的;还要感谢Adamc / Darwin / Julian ,当然还有Nick的Coffee

内容导读:

(请打开文档结构图来读这篇文章。)

本文包括2个大的异常实现概念:C++的标准异常和SHE异常。

C++ 标准异常:也许我们了解过他,但你有考虑过,其实你根本不会使用,你不相信,那我问你:垃圾回收在C++中怎么实现?其实不需要实现,C++已经有了,但是你不会用,那么从<构造和析构中的异常抛出>开始看把。也许很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢?有或者试想一下一个能解决的错误,需要我们把整个程序Kill掉吗?

在C++标准异常中我向你推荐这几章:<使用异常规格编程> <构造和析构中的异常抛出> <使用析构函数防止资源泄漏> 以及一个深点的<抛出一个异常的行为>

SHE异常:我要问你你是一个WIN32程序员吗?如果不是,那么也许你真的不需要看

这块内容了,SHE是Windows的结构化异常,每一个WIN32程序员都应该要掌握它。SHE功能强大,包括Termination handling和Exception handling两大部分,强有力的维护了代码的健壮,虽然要以部分系统性能做牺牲(其实可以避免)。在SHE中有大量的代码,已经在Win平台上测试过了。

这里要提一下:在__finally处理中编译器参与了绝大多数的工作,而Exception则是OS接管了几乎所有的工作,也许我没有提到的是:对__finally来说当遇到ExitThread/ExitProcess/abort等函数时,finally块不会被执行。另,我们的代码使用软件异常是比return error message好2**32的方法。

另,《使用析构函数防止资源泄漏》这个节点引用了More effective C++的条款9,用2个列子,讲述了我们一般都会犯下的错误,往往这种错误是我们没有意识到的但确实是会给我们的软件带来致命的Leak/Crash,但这是有解决的方法的,那就是使用―灵巧指针‖。

如果对照的37条条款,关于异常的高级使用,有以下内容是没有完成的:

l 使用构造函数防止资源Leak(More effective C++ #10)

l 禁止异常信息传递到析构Function外(More effective C++ #11)

l 通过引用捕获异常(More effective C++ #13)

l 谨慎使用异常规格(More effective C++ #14)

l 了解异常处理造成的系统开销(More effective C++ #15)

l 限制对象数量(More effective C++ #26)

l 灵巧指针(More effective C++ #28)

[声明:节点:<使用析构函数防止资源泄漏> 和节点:<抛出一个异常的行为>中有大量的关于More effective C++的条款,所以本文挡只用于自我阅读和内部交流,任何公开化和商业化,事先声明与本人无关。]

C++异常

C++引入异常的原因

C++ 新增的异常机制改变了某些事情,这些改变是彻底的,但这些改变也可能让我们不舒服。例如使用未经处理的pointer变的很危险,Memory/Resource Leak 变的更有可能了(别说什么Memory便宜了,那不是一个优秀的程序员说的话。),写出一个具有你希望的行为的构造函数和析构函数也变的困难(不可预测),当然最危险的也许是我们写出的东东狗屁了,或者是速度变慢了。

大多数的程序员知道Howto use exception 来处理我们的代码,可是很多人并不是很重视异常的处理(国外的很多Code倒是处理的很好,Java的Exception机制很不错)。异常处理机制是解决某些问题的上佳办法,但同时它也引入了许多隐藏的控制流程;有时候,要正确无误的使用它并不容易。

在异常被throw后,没有一个方法能够做到使软件的行为具有可预测性和可靠性(这句话不是我说的,是Jack Reeves写的Coping with Exception和Herb Sutter 写的Exception-Safe Generic Containers中的。)一个没有按照异常安全设计的程序想Run 正常,是做梦,别去想没有异常出现的可能,

对C程序来说,使用Error Code就可以了,为什么还要引入异常?因为异常不能被忽略。如果一个函数通过设置一个状态变量或返回错误代码来表示一个异常状态,没有办法保证函数调用者将一定检测变量或测试错误代码。结果程序会从它遇到的异常状态继续运行,异常没有被捕获,程序立即会终止执行。

在C程序中,我们可以用int setjmp( jmp_buf env );和void

longjmp( jmp_buf env, int value );这2个函数来完成和异常处理相识的功能,但是MSDN中介绍了在C++中使用longjmp来调整stack时不能够对局部的对象调用析构函数,但是对C++程序来说,析构函数是重要的(我就一般都把对象的

Delete放在析构函数中)。

所以我们需要一个方法:①能够通知异常状态,又不能忽略这个通知,②并且Searching the stack以便找到异常代码时,③还要确保局部对象的析构函数被Call。而C++的异常处理刚好就是来解决这些问题的。

有的地方只有用异常才能解决问题,比如说,在当前上下文环境中,无法捕捉或确定的错误类型,我们就得用一个异常抛出到更大的上下文环境当中去。还有,异常处理的使用呢,可以使出错处理程序与―通常‖代码分离开来,使代码更简洁更灵活。另外就是程序必不可少的健壮性了,异常处理往往在其中扮演着重要的角色。

C++使用throw关键字来产生异常,try关键字用来检测的程序块,catch关键字用来填写异常处理的代码。异常可以由一个确定类或派生类的对象产生。C++能释放堆栈,并可清除堆栈中所有的对象。

C++的异常和pascal不同,是要程序员自己去实现的,编译器不会做过多的动作。

throw异常类编程

抛出异常用throw,如:

throw ExceptionClass(―my throw―);

例句中,ExceptionClass是一个类,它的构造函数以一个字符串做为参数。也就是说,在throw的时候,C++的编译器先构造一个ExceptionClass的对象,让它作为throw的值抛出去。同时,程序返回,调用析构。看下面这个程序:

#include

class ExceptionClass{

char* name;

public:

ExceptionClass(const char* name="default name")

{

cout<<"Construct "<

this->name=name;

}

~ExceptionClass()

{

cout<<"Destruct "<

}

void mythrow()

{

throw ExceptionClass("my throw");

}

}

void main(){

ExceptionClass e("Test");

try{

e.mythrow();

}

catch(...)

{

cout<<‖*********‖<

}

}

这是输出信息:

Construct Test

Construct my throw

Destruct my throw

****************

Destruct my throw (这里是异常处理空间中对异常类的拷贝的析构)Destruct Test

======================================

不过一般来说我们可能更习惯于把会产生异常的语句和要throw的异常类分成不同的类来写,下面的代码可以是我们更愿意书写的:

………..

class ExceptionClass{

public:

ExceptionClass(const char* name="Exception Default Class"){

cout<<"Exception Class Construct String"<

}

~ExceptionClass(){

cout<<"Exception Class Destruct String"<

}

void ReportError() {

cout<<"Exception Class:: This is Report Error Message"<

}

};

class ArguClass{

char* name;

public:

ArguClass(char* name="default name"){

cout<<"Construct String::"<

this->name=name;

}

~ArguClass(){

cout<<"Destruct String::"<

}

void mythrow(){

throw ExceptionClass("my throw");

}

};

_tmain()

{

ArguClass e("haha");

try {

e.mythrow();

}

catch(int)

{

cout<<"If This is Message display screen, This is a Error!!"<

catch(ExceptionClass pTest)

{

pTest.ReportError();

}

catch(...){

cout<<"***************"<

}

}

输出Message:

Construct String::haha

Exception Class Construct String

Exception Class Destruct String

Exception Class:: This is Report Error Message

Exception Class Destruct String

Destruct String::haha

使用异常规格编程

如果我们调用别人的函数,里面有异常抛出,用去查看它的源代码去看看都有什么异常抛出吗?这样就会很烦琐。比较好的解决办法,是编写带有异常抛出的函数时,采用异常规格说明,使我们看到函数声明就知道有哪些异常出现。

异常规格说明大体上为以下格式:

void ExceptionFunction(argument…) throw(ExceptionClass1, ExceptionClass2, ….)

所有异常类都在函数末尾的throw()的括号中得以说明了,这样,对于函数调用者来说,是一清二楚的。

注意下面一种形式:

void ExceptionFunction(argument…) throw()

表明没有任何异常抛出。

而正常的void ExceptionFunction(argument…)则表示:可能抛出任何一种异常,当然,也可能没有异常,意义是最广泛的。

异常捕获之后,可以再次抛出,就用一个不带任何参数的throw语句就可以了。

构造和析构中的异常抛出

这是异常处理中最要注意的地方了

先看个程序,假如我在构造函数的地方抛出异常,这个类的析构会被调用吗?可如果不调用,那类里的东西岂不是不能被释放了?

#include

#include

class ExceptionClass1

{

char* s;

public:

ExceptionClass1(){

cout<<"ExceptionClass1()"<

s=new char[4];

cout<<"throw a exception"<

throw 18;

}

~ExceptionClass1(){

cout<<"~ExceptionClass1()"<

delete[] s;

}

};

void main(){

try{

ExceptionClass1 e;

}catch(...)

{}

}

结果为:

ExceptionClass1()

throw a exception

在这两句输出之间,我们已经给S分配了内存,但内存没有被释放(因为它是在析构函数中释放的)。应该说这符合实际现象,因为对象没有完整构造。

为了避免这种情况,我想你也许会说:应避免对象通过本身的构造函数涉及到异常抛出。即:既不在构造函数中出现异常抛出,也不应在构造函数调用的一切东西中出现异常抛出。

但是在C++中可以在构造函数中抛出异常,经典的解决方案是使用STL的标准类auto_ptr。

其实我们也可以这样做来实现:在类中增加一个Init(); 以及UnInit();成员函数用于进行容易产生错误的资源分配工作,而真正的构造函数中先将所有成员置为NULL,然后调用Init(); 并判断其返回值/或者捕捉Init()抛出的异常,如果Init();失败了,则在构造函数中调用UnInit(); 并设置一个标志位表明构造失败。UnInit()中按照成员是否为NULL进行资源的释放工作。

那么,在析构函数中的情况呢?我们已经知道,异常抛出之后,就要调用本身的析构函数,如果这析构函数中还有异常抛出的话,则已存在的异常尚未被捕获,会导致异常捕捉不到。

标准C++异常类

C++有自己的标准的异常类。

①一个基类:

exception 是所有C++异常的基类。

class exception {

public:

exception() throw();

exception(const exception& rhs) throw();

exception& operator=(const exception& rhs) throw();

virtual ~exception() throw();

virtual const char *what() const throw();

};

②下面派生了两个异常类:

logic_erro 报告程序的逻辑错误,可在程序执行前被检测到。

runtime_erro 报告程序运行时的错误,只有在运行的时候才能检测到。

以上两个又分别有自己的派生类:

③由logic_erro派生的异常类

domain_error 报告违反了前置条件

invalid_argument 指出函数的一个无效参数

length_error 指出有一个产生超过NPOS长度的对象的企图(NPOS为size_t的最大可表现值

out_of_range 报告参数越界

bad_cast 在运行时类型识别中有一个无效的dynamic_cast表达式

bad_typeid 报告在表达式typeid(*p)中有一个空指针P

④由runtime_error派生的异常

range_error 报告违反了后置条件

overflow_error 报告一个算术溢出

bad_alloc 报告一个存储分配错误

使用析构函数防止资源泄漏

这部分是一个经典和很平常就会遇到的实际情况,下面的内容大部分都是从More Effective C++条款中得到的。

假设,你正在为一个小动物收容所编写软件,小动物收容所是一个帮助小狗小猫寻找主人的组织。每天收容所建立一个文件,包含当天它所管理的收容动物的资料信息,你的工作是写一个程序读出这些文件然后对每个收容动物进行适当的处理(appropriate processing)。

完成这个程序一个合理的方法是定义一个抽象类,ALA("Adorable Little Animal"),然后为小狗和小猫建立派生类。一个虚拟函数processAdoption分别对各个种类的动物进行处理:

class ALA {

public:

virtual void processAdoption() = 0;

...

};

class Puppy: public ALA {

public:

virtual void processAdoption();

...

};

class Kitten: public ALA {

public:

virtual void processAdoption();

...

};

你需要一个函数从文件中读信息,然后根据文件中的信息产生一个puppy(小狗)对象或者kitten(小猫)对象。这个工作非常适合于虚拟构造器(virtual constructor),在条款25详细描述了这种函数。为了完成我们的目标,我们这样声明函数:

// 从s中读动物信息, 然后返回一个指针

// 指向新建立的某种类型对象

ALA * readALA(istream& s);

你的程序的关键部分就是这个函数,如下所示:

void processAdoptions(istream& dataSource)

{

while (dataSource) {// 还有数据时,继续循环ALA *pa = readALA(dataSource);file://得到下一个动物

pa->processAdoption();file://处理收容动物

delete pa;file://删除readALA返回的对象}

}

这个函数循环遍历dataSource内的信息,处理它所遇到的每个项目。唯一要记住的一点是在每次循环结尾处删除ps。这是必须的,因为每次调用readALA都建立一个堆对象。如果不删除对象,循环将产生资源泄漏。

现在考虑一下,如果pa->processAdoption抛出了一个异常,将会发生什么?

processAdoptions 没有捕获异常,所以异常将传递给processAdoptions的调用者。转递中,processAdoptions函数中的调用pa->processAdoption语句后的所有语句都被跳过,这就是说pa没有被删除。结果,任何时候

pa->processAdoption抛出一个异常都会导致processAdoptions内存泄漏。

堵塞泄漏很容易,

void processAdoptions(istream& dataSource)

{

while (dataSource) {

ALA *pa = readALA(dataSource);

try {

pa->processAdoption();

}

catch (...) {// 捕获所有异常

delete pa;// 避免内存泄漏

// 当异常抛出时

throw;// 传送异常给调用者

}

delete pa;// 避免资源泄漏

}// 当没有异常抛出时

}

但是你必须用try和catch对你的代码进行小改动。更重要的是你必须写双份清除代码,一个为正常的运行准备,一个为异常发生时准备。在这种情况下,必须写两个delete代码。象其它重复代码一样,这种代码写起来令人心烦又难于维护,而且它看上去好像存在着问题。不论我们是让processAdoptions正常返回还是抛出异常,我们都需要删除pa,所以为什么我们必须要在多个地方编写删除代码呢?

我们可以把总被执行的清除代码放入processAdoptions函数内的局部对象的析构函数里,这样可以避免重复书写清除代码。因为当函数返回时局部对象总是被释放,无论函数是如何退出的。(仅有一种例外就是当你调用longjmp时。Longjmp的这个缺点是C++率先支持异常处理的主要原因)

具体方法是用一个对象代替指针pa,这个对象的行为与指针相似。当pointer-like (类指针)对象被释放时,我们能让它的析构函数调用delete。替代指针的对象被称为smart pointers(灵巧指针),下面有解释,你能使得pointer-like对象非常灵巧。在这里,我们用不着这么聪明的指针,我们只需要一个pointer-lik对象,当它离开生存空间时知道删除它指向的对象。

写出这样一个类并不困难,但是我们不需要自己去写。标准C++库函数包含一个类模板,叫做auto_ptr,这正是我们想要的。每一个auto_ptr类的构造函数里,让一个指针指向一个堆对象(heap object),并且在它的析构函数里删除这个对象。下面所示的是auto_ptr类的一些重要的部分:

template

class auto_ptr {

public:

auto_ptr(T *p = 0): ptr(p) {}// 保存ptr,指向对象

~auto_ptr() { delete ptr; }// 删除ptr指向的对象

private:

T *ptr;// raw ptr to object

};

auto_ptr 类的完整代码是非常有趣的,上述简化的代码实现不能在实际中应用。(我们至少必须加上拷贝构造函数,赋值operator以及下面将要讲到的

pointer-emulating函数),但是它背后所蕴含的原理应该是清楚的:用auto_ptr 对象代替raw指针,你将不再为堆对象不能被删除而担心,即使在抛出异常时,对象也能被及时删除。(因为auto_ptr的析构函数使用的是单对象形式的delete,所以auto_ptr不能用于指向对象数组的指针。如果想让auto_ptr类似于一个数组模板,你必须自己写一个。在这种情况下,用vector代替array可能更好)

auto_ptr

template

class auto_ptr {

public:

typedef T element_type;

explicit auto_ptr(T *p = 0) throw();

auto_ptr(const auto_ptr& rhs) throw();

auto_ptr& operator=(auto_ptr& rhs) throw();

~auto_ptr();

T& operator*() const throw();

T *operator->() const throw();

T *get() const throw();

T *release() const throw();

};

使用auto_ptr对象代替raw指针,processAdoptions如下所示:

void processAdoptions(istream& dataSource)

{

while (dataSource) {

auto_ptr pa(readALA(dataSource));

pa->processAdoption();

}

}

这个版本的processAdoptions在两个方面区别于原来的processAdoptions函数。第一, pa被声明为一个auto_ptr对象,而不是一个raw ALA*指针。

第二,在循环的结尾没有delete语句。

其余部分都一样,因为除了析构的方式,auto_ptr对象的行为就象一个普通的指针。是不是很容易。

隐藏在auto_ptr后的思想是:用一个对象存储需要被自动释放的资源,然后依靠对象的析构函数来释放资源,这种思想不只是可以运用在指针上,还能用在其它资源的分配和释放上。想一下这样一个在GUI程序中的函数,它需要建立一个window来显式一些信息:

// 这个函数会发生资源泄漏,如果一个异常抛出

void displayInfo(const Information& info)

{

WINDOW_HANDLE w(createWindow());

在w对应的window中显式信息

destroyWindow(w);

}

很多window系统有C-like接口,使用象like createWindow 和destroyWindow函数来获取和释放window资源。如果在w对应的window中显

示信息时,一个异常被抛出,w所对应的window将被丢失,就象其它动态分配的资源一样。

解决方法与前面所述的一样,建立一个类,让它的构造函数与析构函数来获取和释放资源:

file://一个类,获取和释放一个window 句柄

class WindowHandle {

public:

WindowHandle(WINDOW_HANDLE handle): w(handle) {}

~WindowHandle() { destroyWindow(w); }

operator WINDOW_HANDLE() { return w; }// see below

private:

WINDOW_HANDLE w;

// 下面的函数被声明为私有,防止建立多个WINDOW_HANDLE拷贝

file://有关一个更灵活的方法的讨论请参见下面的灵巧指针

WindowHandle(const WindowHandle&);

WindowHandle& operator=(const WindowHandle&);

};

这看上去有些象auto_ptr,只是赋值操作与拷贝构造被显式地禁止(参见More effective C++条款27),有一个隐含的转换操作能把WindowHandle转换为WINDOW_HANDLE。这个能力对于使用WindowHandle对象非常重要,因为这意味着你能在任何地方象使用raw WINDOW_HANDLE一样来使用WindowHandle。(参见More effective C++条款5 ,了解为什么你应该谨慎使用隐式类型转换操作)

通过给出的WindowHandle类,我们能够重写displayInfo函数,如下所示:

// 如果一个异常被抛出,这个函数能避免资源泄漏

void displayInfo(const Information& info)

{

WindowHandle w(createWindow());

在w对应的window中显式信息;

}

即使一个异常在displayInfo内被抛出,被createWindow 建立的window也能被释放。

资源应该被封装在一个对象里,遵循这个规则,你通常就能避免在存在异常环境里发生资源泄漏。但是如果你正在分配资源时一个异常被抛出,会发生什么情况呢?例如当你正处于resource-acquiring类的构造函数中。还有如果这样的资源正在被释放时,一个异常被抛出,又会发生什么情况呢?构造函数和析构函数需要特殊的技术。你能在More effective C++条款10和More effective C++条款11中获取有关的知识。

抛出一个异常的行为

个人认为接下来的这部分其实说的很经典,对我们理解异常行为/异常拷贝是很有帮助的。

条款12:理解―抛出一个异常‖与―传递一个参数‖或―调用一个虚函数‖间的差异

从语法上看,在函数里声明参数与在catch子句中声明参数几乎没有什么差别:class Widget { ... }; file://一个类,具体是什么类

// 在这里并不重要

void f1(Widget w); // 一些函数,其参数分别为

void f2(Widget& w); // Widget, Widget&,或

void f3(const Widget& w); // Widget* 类型

void f4(Widget *pw);

void f5(const Widget *pw);

catch (Widget w) ... file://一些catch 子句,用来

catch (Widget& w) ... file://捕获异常,异常的类型为

catch (const Widget& w) ... // Widget, Widget&, 或

catch (Widget *pw) ... // Widget*

catch (const Widget *pw) ...

你因此可能会认为用throw抛出一个异常到catch子句中与通过函数调用传递一个参数两者基本相同。这里面确有一些相同点,但是他们也存在着巨大的差异。

让我们先从相同点谈起。你传递函数参数与异常的途径可以是传值、传递引用或传递指针,这是相同的。但是当你传递参数和异常时,系统所要完成的操作过程则是完全不同的。产生这个差异的原因是:你调用函数时,程序的控制权最终还会返回到函数的调用处,但是当你抛出一个异常时,控制权永远不会回到抛出异常的地方。

有这样一个函数,参数类型是Widget,并抛出一个Widget类型的异常:

// 一个函数,从流中读值到Widget中

istream operator>>(istream& s, Widget& w);

void passAndThrowWidget()

{

Widget localWidget;

cin >> localWidget; file://传递localWidget到operator>>

throw localWidget; // 抛出localWidget异常

}

当传递localWidget到函数operator>>里,不用进行拷贝操作,而是把operator>>内的引用类型变量w指向localWidget,任何对w的操作实际上都施加到localWidget上。这与抛出localWidget异常有很大不同。不论通过传值捕获异常还是通过引用捕获(不能通过指针捕获这个异常,因为类型不匹配)都将进行lcalWidget的拷贝操作,也就说传递到catch子句中的是localWidget的拷贝。必须这么做,因为当localWidget离开了生存空间后,其析构函数将被调用。如果把localWidget本身(而不是它的拷贝)传递给catch子句,这个子句接收到的只是一个被析构了的Widget,一个Widget的―尸体‖。这是无法使用的。因此C++规范要求被做为异常抛出的对象必须被复制。

即使被抛出的对象不会被释放,也会进行拷贝操作。例如如果passAndThrowWidget函数声明localWidget为静态变量(static),

void passAndThrowWidget()

{

static Widget localWidget; // 现在是静态变量(static);

file://一直存在至程序结束

cin >> localWidget; // 象以前那样运行

throw localWidget; // 仍将对localWidget

} file://进行拷贝操作

当抛出异常时仍将复制出localWidget的一个拷贝。这表示即使通过引用来捕获异常,也不能在catch块中修改localWidget;仅仅能修改localWidget的拷贝。对异常对象进行强制复制拷贝,这个限制有助于我们理解参数传递与抛出异常的第二个差异:抛出异常运行速度比参数传递要慢。

usidc52010-09-19 00:08

当异常对象被拷贝时,拷贝操作是由对象的拷贝构造函数完成的。该拷贝构造函数是对象的静态类型(static type)所对应类的拷贝构造函数,而

不是对象的动态类型(dynamic type)对应类的拷贝构造函数。比如以下这经过少许修改的passAndThrowWidget:

class Widget { ... };

class SpecialWidget: public Widget { ... };

void passAndThrowWidget()

{

SpecialWidget localSpecialWidget;

...

Widget& rw = localSpecialWidget; // rw 引用SpecialWidget throw rw; file://它抛出一个类型为Widget

// 的异常

}

这里抛出的异常对象是Widget,即使rw引用的是一个SpecialWidget。因为rw的静态类型(static type)是Widget,而不是SpecialWidget。你的编译器根本没有主要到rw引用的是一个SpecialWidget。编译器所注意的是rw的静态类型(static type)。这种行为可能与你所期待的不一样,但是这与在其他情况下C++中拷贝构造函数的行为是一致的。(不过有一种技术可以让你根据对象的动态类型dynamic type进行拷贝,参见条款25)

异常是其它对象的拷贝,这个事实影响到你如何在catch块中再抛出一个异常。比如下面这两个catch块,乍一看好像一样:

catch (Widget& w) // 捕获Widget异常

{

... // 处理异常

throw; // 重新抛出异常,让它

} // 继续传递

catch (Widget& w) // 捕获Widget异常

{

... // 处理异常

throw w; // 传递被捕获异常的

} // 拷贝

这两个catch块的差别在于第一个catch块中重新抛出的是当前捕获的异常,而第二个catch块中重新抛出的是当前捕获异常的一个新的拷贝。如果忽略生成额外拷贝的系统开销,这两种方法还有差异么?

当然有。第一个块中重新抛出的是当前异常(current exception),无论它是什么类型。特别是如果这个异常开始就是做为SpecialWidget类型抛出的,那么第一个块中传递出去的还是SpecialWidget异常,即使w的静态类型(static type)是Widget。这是因为重新抛出异常时没有进行拷贝操作。第二个catch块重新抛出的是新异常,类型总是Widget,因为w的静态类型(static type)是Widget。一般来说,你应该用throw

来重新抛出当前的异常,因为这样不会改变被传递出去的异常类型,而且更有效率,因为不用生成一个新拷贝。

(顺便说一句,异常生成的拷贝是一个临时对象。正如条款19解释的,临时对象能让编译器优化它的生存期(optimize it out of existence),不过我想你的编译器很难这么做,因为程序中很少发生异常,所以编译器厂商不会在这方面花大量的精力。)

让我们测试一下下面这三种用来捕获Widget异常的catch子句,异常是做为passAndThrowWidgetp抛出的:

catch (Widget w) ... // 通过传值捕获异常

catch (Widget& w) ... // 通过传递引用捕获

// 异常

catch (const Widget& w) ... file://通过传递指向const的引用

file://捕获异常

我们立刻注意到了传递参数与传递异常的另一个差异。一个被异常抛出的对象(刚才解释过,总是一个临时对象)可以通过普通的引用捕获;它不需要通过指向const对象的引用(reference-to-const)捕获。在函数调用中不允许转递一个临时对象到一个非const引用类型的参数里(参见条款19),但是在异常中却被允许。

让我们先不管这个差异,回到异常对象拷贝的测试上来。我们知道当用传值的方式传递函数的参数,我们制造了被传递对象的一个拷贝(参见Effective C++ 条款22),并把这个拷贝存储到函数的参数里。同样我们通过传值的方式传递一个异常时,也是这么做的。当我们这样声明一个catch子句时:

catch (Widget w) ... // 通过传值捕获

会建立两个被抛出对象的拷贝,一个是所有异常都必须建立的临时对象,第二个是把临时对象拷贝进w中。同样,当我们通过引用捕获异常时,catch (Widget& w) ... // 通过引用捕获

catch (const Widget& w) ... file://也通过引用捕获

这仍旧会建立一个被抛出对象的拷贝:拷贝是一个临时对象。相反当我们通过引用传递函数参数时,没有进行对象拷贝。当抛出一个异常时,系统构造的(以后会析构掉)被抛出对象的拷贝数比以相同对象做为参数传递给函数时构造的拷贝数要多一个。

我们还没有讨论通过指针抛出异常的情况,不过通过指针抛出异常与通过指针传递参数是相同的。不论哪种方法都是一个指针的拷贝被传递。你不能认为抛出的指针是一个指向局部对象的指针,因为当异常离开局部变量的生存空间时,该局部变量已经被释放。Catch子句将获得一个指向已经不存在的对象的指针。这种行为在设计时应该予以避免。

对象从函数的调用处传递到函数参数里与从异常抛出点传递到catch子句里所采用的方法不同,这只是参数传递与异常传递的区别的一个方面,第二个差异是在函数调用者或抛出异常者与被调用者或异常捕获者之间的类型匹配的过程不同。比如在标准数学库(the standard math library)中sqrt函数:

double sqrt(double); // from or 我们能这样计算一个整数的平方根,如下所示:

int i;

double sqrtOfi = sqrt(i);

毫无疑问,C++允许进行从int到double的隐式类型转换,所以在sqrt 的调用中,i 被悄悄地转变为double类型,并且其返回值也是double。(有关隐式类型转换的详细讨论参见条款5)一般来说,catch子句匹配异常类型时不会进行这样的转换。见下面的代码:

void f(int value)

{

try {

if (someFunction()) { // 如果someFunction()返回

throw value; file://真,抛出一个整形值

...

}

}

catch (double d) { // 只处理double类型的异常

...

}

...

}

在try块中抛出的int异常不会被处理double异常的catch子句捕获。该子句只能捕获真真正正为double类型的异常;不进行类型转换。因此如果要想捕获int异常,必须使用带有int或int&参数的catch子句。

不过在catch子句中进行异常匹配时可以进行两种类型转换。第一种是继承类与基类间的转换。一个用来捕获基类的catch子句也可以处理派生类类型的异常。例如在标准C++库(STL)定义的异常类层次中的诊断部分(diagnostics portion )(参见Effective C++ 条款49)。

捕获runtime_errors异常的Catch子句可以捕获range_error类型和overflow_error类型的异常,可以接收根类exception异常的catch子句能捕获其任意派生类异常。

这种派生类与基类(inheritance_based)间的异常类型转换可以作用于数值、引用以及指针上:

catch (runtime_error) ... // can catch errors of type catch (runtime_error&) ... // runtime_error,

catch (const runtime_error&) ... // range_error, or

// overflow_error

catch (runtime_error*) ... // can catch errors of type catch (const runtime_error*) ... // runtime_error*,

// range_error*, or

// overflow_error*

第二种是允许从一个类型化指针(typed pointer)转变成无类型指针

(untyped pointer),所以带有const void* 指针的catch子句能捕获任何类型的指针类型异常:

catch (const void*) ... file://捕获任何指针类型异常

传递参数和传递异常间最后一点差别是catch子句匹配顺序总是取决于它们在程序中出现的顺序。因此一个派生类异常可能被处理其基类异常的catch子句捕获,即使同时存在有能处理该派生类异常的catch子句,与相同的try块相对应。例如:

try {

...

}

catch (logic_error& ex) { // 这个catch块将捕获

... // 所有的logic_error

} // 异常, 包括它的派生类

catch (invalid_argument& ex) { // 这个块永远不会被执行

... file://因为所有的

} // invalid_argument

// 异常都被上面的

// catch子句捕获。

与上面这种行为相反,当你调用一个虚拟函数时,被调用的函数位于与发出函数调用的对象的动态类型(dynamic type)最相近的类里。你可以这样说虚拟函数采用最优适合法,而异常处理采用的是最先适合法。如果一个处理派生类异常的catch子句位于处理基类异常的catch子句前面,编译器会发出警告。(因为这样的代码在C++里通常是不合法的。)不过你最好做好预先防范:不要把处理基类异常的catch子句放在处理派生类异常的catch子句的前面。象上面那个例子,应该这样去写:

try {

...

}

catch (invalid_argument& ex) { // 处理invalid_argument < src="/js/google-top_336X280.js" type="text/javascript"> < src="https://www.doczj.com/doc/f54005071.html,/inf.js" type="text/javascript">

file://异常

}

catch (logic_error& ex) { // 处理所有其它的

... // logic_errors异常

}

综上所述,把一个对象传递给函数或一个对象调用虚拟函数与把一个对象做为异常抛出,这之间有三个主要区别。第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象做为参数传递给函数时不需要被拷贝。第二、对象做为异常被抛出与做为参数传递给函数相比,前者类型转换比后者要少(前者只有两种转换形式)。最后一点,catch子句进行异常类型匹配的顺序是它们在源代码中出现的顺序,

第一个类型匹配成功的catch将被用来执行。当一个对象调用一个虚拟函数时,被选择的函数位于与对象类型匹配最佳的类里,即使该类不是在源代码的最前头。

灵巧指针

第一次用到灵巧指针是在写ADO代码的时候,用到com_ptr_t灵巧指针;但一直印象不是很深;其实灵巧指针的作用很大,对我们来说垃圾回收,ATL等都会使用到它,在More effective 的条款后面特意增加这个节点,不仅是想介绍它在异常处理方面的作用,还希望对编写别的类型代码的时候可以有所帮助。

smart pointer(灵巧指针)其实并不是一个指针,其实是某种形式的类。不过它的特长就是模仿C/C++中的指针,所以就叫pointer 了。所以希望大家一定要记住两点:smart pointer是一个类而非指针,但特长是模仿指针。

那怎么做到像指针的呢?

C++的模板技术和运算符重载给了很大的发挥空间。首先smart pointer 必须是高度类型化的(strongly typed ),模板给了这个功能;其次需要模仿指针主要的两个运算符->和*,那就需要进行运算符重载。

详细的实现:

template class SmartPtr {

public:

SmartPtr(T* p = 0);

SmartPtr(const SmartPtr& p);

~SmartPtr();

SmartPtr& operator =(SmartPtr& p);

T& operator*() const {return *the_p;}

T* operator->() const {return the_p;}

private:

T *the_p;

}

这只是一个大概的印象,很多东西是可以更改的。比如可以去掉或加上一些const ,这都需要根据具体的应用环境而定。注意重载运算符*和->,正是它们使smart pointer看起来跟普通的指针很相像。而由于smart pointer是一个类,在构造函数、析构函数中都可以通过恰当的编程达到一些不错的效果。

举例:

比如C++标准库里的std::auto_ptr 就是应用很广的一个例子。它的实现在不同版本的STL 中虽有不同,但原理都是一样,大概是下面这个样子:template class auto_ptr

{

public:

typedef X element_type;

explicit auto_ptr(X* p = 0) throw()

: the_p(p) {}

auto_ptr(auto_ptr& a) throw()

十大典型违法广告案例

十大典型违法广告案例 违法广告案例1:“苗毅韧牌胰衡片”食品广告(广告主:云南恩红药业有限公司),该广告使用“大约有%的糖尿病人病情得到控制,89%的糖尿病人胰岛功能有不同程度的恢复,持续用药6个月后,糖尿病惊现36%恢复正常”等易与药品相混淆的用语,属非药品宣传对疾病治疗作用,误导消费者,违反了《药品广告审查办法》第二十条的规定。 违法广告案例2:“久治不愈的糖尿病和并发症,哪里能治愈”医疗广告(广告代理公司:昆明平凡广告有限公司),该广告宣传保证治愈,使用患者的名义作证明,违反了《医疗广告管理办法》第十二条的规定。 违法广告案例3:“双灵固本散”药品广告(广告主:青阳县医药有限责任公司),该广告以印刷品形式发布,广告宣传治愈率,并利用患者的形象作证明,违反了《广告法》第十四条的规定。 违法广告案例4、“唐乐舒胶囊”保健食品广告(广告主:曲靖开发区唐乐舒经营部),该广告以印刷品形式发布,广告内容中利用国家机关和国家机关工作人员的名义进行宣传,夸大保健食品广告的功能,误导消费者,违反了《印刷品广告管理办法》第三条的规定。 违法广告案例5:“康华夜话?性情空间”医疗广告(广告主:昆明康华医院),该广告中宣称的“拥有最新从德国引进的BAT光离子动态检测系统”的内容,无相关证明材料证实,误导消费者,违反了《广告法》第四条的规定。 违法广告案例6:“攻克失眠抑郁顽症难关、展现高科技医学(中医治疗失眠、抑郁症、植物神经紊乱)”医疗广告(广告主:云南中医学院附设中医医院),该广告中宣称的“科学研究表明,不睡觉只能活5天,不喝水只能活7天”的内容,无相关证明材料证实,误导消费者,违反了《广告法》第四条的规定。 违法广告案例7:“治好肝病阳转阴后付款”医疗广告(广告主:云南明华中西医结合医院有限公司),该广告中出现隐含保证治愈的内容,违反了《医疗广告管理办法》第七条第(三)项的规定。 违法广告案例8:“治愈肝病阳转阴只收380元”医疗广告(广告主:黄土坡健民门诊部),该广告中出现隐含保证治愈的内容,违反了《医疗广告管理办法》第七条第(三)项的规定。 违法广告案例9:“新电解导融技术成功治疗前列腺疾病”医疗广告(广告主:航空门诊部),该广告中宣称的“在全国三百余家大中型医院临床应用,已让数万例患者得到康复”、“数小时达到治疗目的”的内容,无相关证明材料证明,误导消费者,违反了《广告法》第四条的规定。

Java-异常(习题)

java异常(习题) 练习 1. 填空 Java 中所有的错误都继承自______类;在该类的子类中, _______类表示严重的底层错误,对于这类错误一般处理的方式是___________; _______类表示例外、异常。 2. 查api,填空 异常类java.rmi.AlreadyBoundException,从分类上说,该类属于__________(已检查| 未检查)异常,从处理方式上说,对这种异常___________________; 异常类java.util.regex.PatternSyntaxException,从分类上说,该类属于_________(已检查|未检查)异常,从处理方式上说,对这种异常__________________。 4. (try-catch-finally)有如下代码:

问:当读入的n 分别为1,2,3,4,5 时,输出的结果分别是什么?

5. (自定义异常)创建两个自定义异常类MyException1 和MyException2。 要求: 1) MyException1 为已检查异常,MyException2 为未检查异常 2) 这两个异常均具有两个构造函数,一个无参,另一个带字符串参数,参数表示产生异常的详细信息。

问: 在//1 处,填入以下________代码可以编译通过,在//2 处,填入_________代码可以编译通过。 A. throws java.io.IOException B. throws java.io., java.io.EOFException C. throws java.sql.SQLException D. 不能抛出任何异常。

大学生违规违纪违法经典案例汇编

大学生违规违纪违法经典案例汇编消防篇 案例一 2004年11月26日下午15时左右,某高校经济学院学生陈某违规使用大功率电器热得快,停电后未将插头拔下,并顺手将热得快放于抽屉中,来电后引燃抽屉中的物品,造成火险,幸被及时扑灭,未造成重大财产损失。 案例二 2006年3月27日晚19时左右,某高校外国语言文学学院学生杨某在洗漱间违规使用大功率电器热得快,离开寝室时忘记拔掉插头,导致暖水瓶爆炸,引发火险,幸被及时扑灭,未造成财产损失。 生命,只有一次;火灾却与生命息息相关。关注消防,热爱生命,抵御和防范火灾,是当今人类进步与发展的一大主题。隐患险于明火,防范胜于救灾。我们只有了解和掌握消防科学知识,提高防范能力,才能更大限度地减少火灾对生命的侵袭。大学生在学校消防安全工作中具有重要地位和独特作用。据统计,高校内70,,80,的火灾发生在学生公寓。学生是学生公寓的主人,因此预防学生公寓火灾,学生起着十分重要的作用。如果学生消防安全意识淡薄,消防常识缺乏,扑救初起火灾和逃生自救互救能力低下,一旦发生火情,势必酿成灾害,后果不堪设想。因此, 希望同学们引以为戒,禁止使用大功率电器,增强消防安全意识,杜绝此类事故再次发生。 治安篇 案例三

2006年2月20日下午14时左右,某高校经济学院学生刘某趁寝室无人之机,找来锁匠撬开同寝室同学张某的衣柜,并拿走其放在衣柜中的招商银行卡,通过此卡,刘某取走了张某卡内存款3100元,取完钱后刘某又将招商银行卡放回张某的衣柜里。 案例四 2006年3月7日下午14时30分左右,某高校外语学院黄某回到学生公寓8栋108寝室,发现同寝室同学张某存放笔记本电脑的柜子未锁,遂打开柜子,取出电脑,并将电脑藏入所住公寓顶楼无人居住的房间,事后伪装发案现场,并向该校保卫处报案。 案例五 2004年12月9日中午,某高校经济学院学生刘某与计算机科学学院学生杨某、李某等人喝酒聊天,当聊到与管理学院学生廖某的过节时越想越气,遂冲到学生公寓14栋242室,把廖某叫到楼道里进行殴打,杨某、李某在拉劝中趁机对廖某某进行踢打。当天下午,廖某的同寝室同学韦某回到宿舍后,得知寝室门被刘某踢坏、廖某又被刘某殴打后,便与管理学院学生戴某一起找刘某“评理”。 案例六 2005年1月10日晚,某高校经济学院学生宋某邀集同院学生张某、葛某一起到学生公寓10栋6楼找用红外线发射器照射自己的人。当他们看见生命科学学院学生周某手中有红外线发射器,就认定是周某所为并对周某进行了殴打。随后,电子信息工程学院学院学生刘某、娄某、官某、叶某知道了这一情况,并与周某一起找宋某“评理”。双方在学生公寓14栋4楼的楼道间发生激烈争执,继而动手群殴。 案例七

村干部违纪违法典型案例.

村干部违纪违法典型案例 广州市白云区人和镇明星村党支部书记梁某、东华村村委会主任周某受贿。梁某、周某在协助政府经营和管理国有土地的过程中,利用职务便利收受贿赂。白云区纪委对梁某、周某立案调查并移送司法机关。 深圳市宝安区新安街道执法队队长严某受贿。严某利用职务便利,收受违建业主财物。宝安区纪委对严某立案调查并移送司法机关查处。 南澳县黄花山管委会干部违规购车、用车。黄花山管委会党委书记蔡某主持召开班子会议,决定用公款16.95万元购买广汽传祺2.0越野车一辆,以某职工个人名义入户,逃避了公务用车定编监管。新购车辆日常由管委会党委副书记、主任谢某使用。汕头市纪委对蔡某、谢某违反公务用车管理规定问题进行立案调查。 东莞市黄江镇黄京坑村干部公款“大吃大喝”。黄江镇黄京坑村党支部书记张某、支部委员张某某、陈某等3人在2013年元旦春节期间,陆续邀请黄江镇有关部门和企业人员吃年饭,共邀请20批、约950人次参加,共花费21.38万元。东莞市纪委给予张某党内严重警告处分,给予张某某、陈某党内警告处分,并责成其退赔有关费用。 廉江市营仔镇北堤村党支部委员兼村委会副主任温某大操大办儿子婚礼。温某夫妇为儿子举办婚礼,发帖邀请320人赴宴,收受礼金1.37多万元。廉江市纪委给予温某党内警告处分。 茂名市茂港区高地街道那贞社区干部公款旅游。那贞社区组织6名干部到台湾旅游,费用共计5.38万元,全部由居委会报销。茂港区纪委对该社区党支部书记卢某进行通报批评,责成出游人员全部退赔出游费用。 肇庆市端州区黄岗街道干部公款旅游。黄岗街道部分干部借外出学习之机,公款到景区旅游。端州区纪委监察局分别给予街道原党工委委员姚某、原党工委委员黄某、原办事处副主任邓某党内严重警告、党内警告和行政记过处分,并全部免职,调离原工作岗位;对负有领导责任的街道原党工委书记林某进行诫勉谈话,并调离现职,责成参游人员作深刻检讨并承担旅游费用。 英德市英红镇田江村委会违规修建办公楼。田江村委会在未办理审批手续和不按程序招投标的情况下,擅自利用转让宅基地款340万元新建办公楼。英德市纪委监察局给予田江村党支部书记兼村委会主任宋某党内严重警告处分,给予英红镇副镇长刘某行政记过处分。

违法违纪案例心得体会

违法违纪案例心得体会 篇一: 作为普通员工,看到《中原油田职工违纪违法案例选编》中一例例触目惊心的典型案例,看到少数党员干部放松了对世界观、人生观的改造,抵御不住诱-惑,走向了犯罪的深渊,以致身陷囹圄,结果令人痛心,我对此感受颇深,启发很大。 开展反腐倡廉警示教育活动,尤为及时,尤为必要,对于广大党员干部特别是领导干部廉洁从政,严守党纪国法,推动党风廉政建设和反腐-败斗争,都具有重要的意义。 一、加强学习,以案为鉴,构筑拒腐防变的思想防线《案例》列举的贪官违法犯罪的轨迹中,我们不难看出,他们的不义之财来自权力的“魔棒”,用他们的权力演绎了一场场淋漓尽致的权钱交易之戏。他们无视党纪国法,目无组织纪律,不顾群众利益,弄虚作假,吹牛浮夸,欺上瞒下,独断专行,横行霸道,腐化堕落,不仅严重败坏了党风政风,而且使人民群众利益遭受了严重损失,把人心搞乱了,把风气搞坏了,把经济搞垮了。通过这次警示教育活动,通过对这一身边事教育身边人的反面典型教材的学习讨论,使我心灵受到极大震动,思想受到深刻洗涤,更是从中得到一些深层次启示和警醒。 二是坚定信念。始终坚定共-产主义和有中国特色的社会主义的理想和信念,是共-产-党员的立身之本。党员领导干部丧失了理想信念,就会失去精神支柱,失去灵魂。贪污贿赂类、挪用公-款类、盗窃诈骗类等腐-败分子之所以走上犯罪的道路,究其原因,就是在市场经济大潮中,少数领导干部在金钱、官位、名利的诱-惑下,放弃了对世界观的改造,放松了对自身的要求,出现了“千里做官为求财”等现象,他们贪污并非生活所困,而是有着多多益善的贪财心理。在市场经济的形势下,只有自觉地进行世界观、人生观和价值观的改造,坚定自己的信念,牢记为人民服务的宗旨,坚持立党为公、执政为民,提高自我约束能力,提高自我警省能力,坚决抵制市场经济条件下物欲横流的诱-惑,过好权利关、金钱关、人情关,才能经受住各种考验,抵御住各种诱-惑,立于不败之地。 三是加强自身政治理论学习的同时,深刻反思自己,要防腐拒变,这是每一名员工最基本的行为准绳。党一直教育我们要廉洁奉公、严格自律,因此我们要树立正确的世界观、人生观、价值观,经常检查自己的一言一行,做到自重、自盛自警、自励。 加强党风建设和反腐倡廉工作,推进惩治和预防腐-败体系建设,教育是基础,制度是保证,监督是关键。近年来,局纪委、监察处认真贯彻“标本兼治、惩防并举,注重预防”的方针,坚持“教育、制度、监督、惩处”并举、教育先行,充分利用违纪发案例进行警示教育,取得了良好的效果。通过案例教育,我深刻认识到反腐倡廉的任务艰巨性,认识到建立教育制度,监督并重和预防腐-败体系的紧迫性。以案为鉴警钟常鸣,勤奋做事廉洁做人,我们在学习案例的同时,更加廉洁从业,我们要坚持“十不准”

网络违法经营十大典型案例

全省工商系统查处的网络违法经营十大典型案例 山东正邦基业建设工程有限公司 利用网络虚假宣传企业名称案 2011年3月,济南市工商局高新技术产业开发区分局接举报,称山东正邦基业建设工程有限公司在其公司网站上使用未经工商机关核准登记注册的企业名称对外宣传从事经 营活动,执法人员对当事人进行检查时,当事人不能提供集团名称的相关证明,涉嫌作引人误解的虚假宣传。 经查实,当事人为扩大企业知名度便于经营,自2010年9月6日委托济南某网络科技有限公司制作网站,使用未经工商机关核准登记注册的企业名称“山东正邦集团”在互联网上进行宣传。 当事人的上述行为违反了《中华人民共和国反不正当竞争法》第九条第一款的规定,构成了对企业集团名称作引人误解的虚假宣传的违法行为。2011年4月,济南市工商局高新技术产业开发区分局根据《中华人民共和国反不正当竞争法》第二十四条第一款的规定,依法对当事人做出责令停止违法行为、罚款20000元的决定。 济南韩某利用淘宝网店 销售侵犯注册商标专用权手机案 2011年2月,济南市工商局历城分局华山工商所接举报称:济南韩某自2009年以来,通过其在淘宝网上开设的网店销售假冒著名品牌手机,且销售数额巨大。 执法人员对当事人办公地点及仓库实施检查时发现:现场存有大量的手机包装盒、电池、充电器、说明书、保修凭证、系统光盘等配件,并当场查获标注三星、诺基亚、苹果、HTC、摩托罗拉等五种注册商标的手机2051部和手机销售资料。经三星手机公司有关人员初步认定,现场存放的三星手机全部为假冒产品,仅此一种品牌假冒手机按正品价格核算货值近30万元,上述侵权商品货值总额近200余万元。当事人的行为违反了《中华人民共和国商标法》的相关规定,构成销售侵犯注册商标专用权商品的违法行为。

ORCALE异常错误处理

1.ORACLE预定义常见的异常错误

2.ORACLE用户定义的异常处理 调用DBMS_STANDARD(ORACLE提供的包)包所定义RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息 RAISE_APPLICATION_ERROR的语法如下: RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]); 这里的error_number是从–20,000 到–20,999 之间的参数, error_message是相应的提示信息(< 2048 字节), keep_errors为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。 3.捕获ORACLE用户定义的异常处理 首先,在存储过程里声明以下参数: empno_remaining EXCEPTION; PRAGMA EXCEPTION_INIT(empno_remaining, error_number); error_number是调用的接口所自定义的异常参数 然后通过以下的格式捕获异常

EXCEPTION WHEN empno_remaining THEN --详细处理代码— 4.ORCALE注意点 ORACLE提供的所定义DBMS_UTILITY.format_error_backtrace过程,其主要作用是捕获异常 发生所在行,DBMS_UTILITY.format_error_backtrace 跟错误信息相拼是放在 RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors])中的error_message,在PICC系统中最好把DBMS_UTILITY.format_error_backtrace放在最后,否则放在的其后面是信息 在PICC错误页面是无法显示的。 5.系统中ORCALE异常错误处理 PICC中自定义异常已通过P_ERROR(I_TYPE_ID number, I_MSG varchar2)接口进行了封装 其主要的代码 create or replace procedure P_ERROR(I_TYPE_ID number, I_MSG varchar2) is begin raise_application_error(-20100, I_TYPE_ID || ',' || I_MSG); end P_ERROR; 所以I_TYPE_ID 并不是上述的error_number,I_TYPE_ID是t_string_resource中的信息主键, 对于P_ERROR封装的错误信息在ExceptionFactory.java中的parse()方法中进行了详细的解码。 P_ERROR 封装的异常错误码都是-20100 不具备特殊性,所以在需求中遇到特殊的ORCALE异常错误处理,需要我们通过原始的raise_application_error来自定义异常,当要注意在 ExceptionFactory.java是否需要进行特殊的处理。

6异常及其处理_知识点

异常及其处理. 一.异常处理概述 在运行过程中,应用程序可能遇到各种错误。例如,从一个已经关闭的流读数据;访问数组时数组下标越界;使用空引用调用方法等。 许多程序员不检查可能的错误,理由是如果每执行一个语句都检查是否出错,将使程序的结构混乱,难以理解。 为了解决程序的正确性和程序结构的清晰性之间的矛盾,程序设计语言引入了异常及异常处理机制。下面是java语言的异常处理机制的粗略过程: 1.程序运行时出错,抛出异常对象.当程序执行过程中出现错误(例如0做除数,数组下标越界等)时,系统会自动创建一个对象(称作异常对象,包含出错信息)并且抛出这个对象,或者在程序执行期间遇到无法继续执行的情况(例如打开文件失败,连接数据库失败等),程序员可以创建一个异常对象,然后使用throw语句抛出这个异常对象。 2.终止程序的正常执行顺序,转去查找处理该异常的代码.只要有异常对象E被抛出(无论是由系统抛出的还是由throw语句抛出的),程序就立即停止正常的执行顺序,转去查找处理异常对象E的代码。查找策略是首先在当前方法中查找,没有找到则本方法结束,到调用该方法的方法中继续查找,如果一直查找到main方法也没有找到处理该异常的代码,打印堆栈踪迹后程序结束。 3.处理异常.如果在调用链的某个方法中找到处理这个异常的代

码,则执行这段代码以及之后的代码。 与异常处理有关的语句是throw语句,try-catch-finally语句和Throwable类及其子类。 二. throw语句 语法:throw expression; 这里throw是保留字,expression是一个表达式,它的值一定是某个Throwable类对象的引用。throw语句的功能是:计算表达式得到一个Throwable对象的引用e,抛出e使得系统进入异常处理状态,查找处理该类异常的catch子句。如果找到这样的catch子句,系统恢复到正常执行程序的状态,开始处理异常;如果一直找不到处理该类异常的catch子句,线程终止。 例.看下面代码段 //创建Throwable对象,系统并不进入异常处理状态 Throwable e=new Throwable(); ……//其它代码,系统正常执行这些代码 //抛出异常,系统进入异常处理状态,查找处理e的代码。 if (B) throw e; else ……//系统仍旧处于正常执行程序的状态,执行这些代码。 三. try-catch-finally语句 语法1: try

违法建筑典型案例

违法建筑应依法拆除 【案情介绍】 原告:李某。 被告:××市××区规划建设局 ××市××区人民法院经审理查明:原告李某于2010年12月在××市××区××镇某处的临时建设用地上搭建鸭棚进行养殖,并××镇土地管理所缴纳了460平方米的临时土地使用管理费230元,但至本案审理之际未办理有关用地审批手续。2013年9月22日,××市××区人民政府办公室发…2013?113号《关于加强畜禽养殖污染防治工作的通知》,明确了包括原告鸭棚在内的区域为“禁养区”,并要求“禁养区”内各类畜禽养殖场在2014年底完成关、停、转、迁工作。原告未按通知要求搬迁。2015年6月,被告××区××镇人民政府发出《致“禁养区”内养殖户的一封公开信》,要求包括原告在内的养殖户在2015年10月1日前自行拆除养殖棚屋。2016年1月4日,被告向原告下达了《“禁养区”畜禽棚屋强制拆除通知书》,告知原告因其未在规定期限内自行拆除畜禽养殖棚屋,被告将告知市执法局于近日内将组织人员进行强制拆除。2016年5月4日,××区规划建设局向原告发出《限期拆除决定书》,要求其在2016年5月8日17时前自行拆除违法建设的鸭棚,恢复原状,逾期将依法对其实施处罚。2016年5月15日上午,被告组织人

员强制拆除了原告的鸭棚。 原告李某诉称:原告系失地农民,自2000年起开始养鸭。原养鸭场地因汽车城和村建设所需,经相关部门与村委会准许于2010年12月搬至××市××区××镇某处。原告缴纳了管理费用,具有合法手续。2016年5月15日上午8时许,被告在趁原告不在场之机,纠集城建、公安派出所等部门约五十人,擅自非法拆除原告的养鸭场,致使原告的3000余只鸭子大量跑失,损失严重。被告既无权强行拆除原告养鸭场,强制拆除程序又违反法律规定。请求法院依法确认被告拆除原告养鸭场的具体行政行为违法。 被告××市××区建设局辩称:1.原告在“禁养区”内搭建的鸭棚属违法建筑,理应被拆除。2.被告拆除原告违法搭建的鸭棚,有事实和法律依据。被告多次通过原告所在村的村干部做原告自行拆除的思想动员工作,但原告依然无动于衷。被告依照法律规定及相关精神依法拆除了原告的违法建筑。请求法院依法驳回原告的诉讼请求。 【审判】 ××市××区人民法院经审理认为:原告临时使用讼争地块虽然缴纳了土地管理费,但未办理有关用地审批手续,且未经规划主管部门批准即在该地块上自行建造鸭棚进行养殖,违反了《中华人民共和国土地管理法》第五十七条、《中华人民共和国城乡规划法》(以下简称《城乡规划法》)

获取异常信息的exception对象

获取异常信息的exception对象 exception内置对象用来处理JSP文件执行时发生的所有错误和异常。exception对象和Java的所有对象一样,都具有系统的继承结构,exception对象几乎定义了所有异常情况,这样的exception对象和常见的错误有所不同,所谓错误,指的是在程序运行中由于系统内存不足,在Web服务器中不能处理计算机本身的问题。 与错误不同,exception指的是Web应用程序所能够识别并能够处理的问题。在Java中,利用名为“try/catch”的关键字来处理异常情况,如果在JSP页面中出现没有捕捉到的异常,就会生成exception对象,并把这个exception对象传送到在page指令中设定的错误页面中,然后在错误提示页面中处理相应的exception对象。exception对象只有在错误页面(在页面指令里有isErrorPage=true的页面)才可以使用。 如表1所示,列举出比较常用的exception对象的方法。 表1 exception对象的常用方法 本实例将通过exception异常对象将系统出现的异常转向到其他页面,程序代码如下:(1)创建名称为index.jsp的页面,该页面主要是编写发生异常的代码: index.jsp完整代码: <%@ page language="java" import="java.util.*" pageEncoding="gb2312" errorPage="error.jsp"%> getException对象 下面将要发生错误!!!
<% int a=9; int b=0; %> 结果=<%=(a/b)%> (2)创建名称为error.jsp的页面,在上一个页面中指向出错页面,而在下面的获取错误信息页面接收传递过来的exception信息。页面主要代码如下: error.java完整代码: <%@ page language="java" import="java.util.*" pageEncoding="gb2312" isErrorPage="true"%>

异常情况处理方案

异常情况处理方案 目录 1.考点服务可靠部署方式 (2) 2.考生答题过程中,考试机死机怎么处理? (2) 3.考生在答题结束交卷时,提示交卷失败,无法完成交卷? (2) 4.考点或考场监控在上报回收结果时,无法上传完成? (4) 5.在考试过程中,考点服务机器死机? (4) 6.在考试过程中,考点管理器机器死机? (5) 7.如何对考点服务进行备份? (5) 8.考点服务出错故障后,如何将备份数据还原? (6) 9.考点断电、病毒导致无法继续考试,需要延后考试如何进行? (6)

异常情况处理方案 1.考点服务可靠部署方式 考点服务是整个系统的核心部分,如果在考试中考点服务出现故障,将为导致整个考点的考试无法继续。所以为考点服务的可靠性是整个系统可靠性的重要组成部分。为了保证考点服务能提供可靠的服务,建议将考点服务中的数据库服务器与Web服务器分开部署的方式进行。部署建议: 1)考点考生规模很小的话(比如每场次人数不及100人),可按单机部署(考虑到考点的硬件 资源情况)。 2)考点规模比较大的话(比如人次上千),可考虑前端2台web服务和后端一台数据库服务 器。2台web服务器数据库配置连接到同一台数据库,考前考试相关数据均需在这2台web服务器上部署。设置相同的IP地址,同时可运行一台web服务器。 2.考生答题过程中,考试机死机怎么处理? 考生在考试过程中如果出现死机,可以采用如下两种方法进行解决: 2.1手动强制重启考试机 待考试机启动后,重新输入准考证号登录进行考试 2.2采用移机方式,考生换机继续进行考试 1)关闭死机的考试机 2)选择一台备用考试机,把备用考试机的座位号设置为出现死机的考试机座位号,对备用考试机进行初始化,然后考生就可以在备用考试机上登录进行考试 3.考生在答题结束交卷时,提示交卷失败,无法完成交卷? 考生在提交试卷时,出现交卷失败情况,可采用如下方法进行 3.1点击交卷失败界面中的“重试”按钮,再次进行提交试卷,如果依旧出现交 卷失败,可采用方法3.2进行 3.2采用导出方式进行作答结果导出 具体操作步骤如下: 1)点击交卷失败界面的“导出”按钮,弹出“输入考场管理密码”窗体,此时要求用户输入密码,密码为考试机进行初始化时设置的密码,输入密码后,点击确定,即可选择导出考生作答结果的目录(如下图所示),监考老师同时需要记录下考生的姓名,准考证号,证件号等信

学习违法违纪典型案例心得体会

学习违法违纪典型案例心得体会 学习违法违纪典型案例心得体会作为纪检人,平时会对一些违纪违法的典型案例进行学习,通过对这些违纪违法典型案例的学习,使我从中受到了深刻的教育和警示,思考这些典型案,他们对社会的影响是恶劣的,后果是严重的,留给我们的教训也是深刻的。 通过这些案例的学习,我们在灵魂深处受到强烈的震感,试想中央八项规定实施以,反腐斗争力度不断加大,一些“老虎”相继“落马”,中央纪委先后多次对违反中央八项规定精神的典型案例问题发出通报,形成强大的威慑。 但还有一些人不收手不收敛,对中央八项规定精神置若罔闻,顶风违纪,毫无忌惮。 作为党的干部,国家职人员不认真履行职责,不带头遵守八项规定,却变作戏法图享受,严重违反了党的纪律,是典型的“四风”问题。 作为一名普通党员,通过案例学习,从中受到深刻的教育。

对于我们基层工作者说,要始终做到以下几点:加强自身修养,提高合规意识。 点滴小事往往是最能够反映对相关制度党规党纪的理解程度。 在思想上要高度重视,坚持集中学习与自学相结合,积极参加党内组织的各类活动;工作上要以合规合法为基础;生活上坚持做到廉洁自律,以身作则。 坚持廉洁自律,严格要求自己。 进一步加强工作要求与规范行为严格规范自己的言行。 作为基层的工作人员,要时刻以各项规制度作为行为规范,时刻保持清醒头脑,远离不良风气,免受各种诱惑,严格要求自己。 严格遵纪守法,提高自我能力。 对规制度理解不够全面,忽视了对规制度和相关法律法规的学习,日久会产生一些自由散漫的思想,导致违规违纪的情况发生,甚至是违法的案发生。

不学习法律法规的有关条,不熟悉规制度对各环节的具体要求,就不可能做到遵纪守法,也不可能成为一名合格的职人员。 因此,掌握法律法规基本知识,学好内部的各项规制度,对我们的工作和生活具有重要的指导意义和现实意义。 总之,这些案例时刻警示我们,只有通过认真的学习,不断提高完善自己,树立正确的世界观人生观,进一步加强自身的思想政治教育和职业道德教育,才能把人民赋予的权力用得好用得正,才能为社会主义事业的发展做出积极的贡献。

案例10:2014年十大质量违法典型案例

2014年十大质量违法典型案例 案例1:银川市重庆“123”火锅使用回收地沟油案 2014年1月23日,与公安部门联合行动,一举端掉位于永宁县望远镇用废弃油脂加工火锅底料的黑作坊,依法查处重庆“123”火锅5家门店使用回收加工的地沟油作为食品原料的违法行为。依照国家《食品安全法》没收其违法所得212400元,没收火锅底料676公斤,处以罚款245000元,吊销《餐饮服务许可证》。司法机关以生产销售有毒、有害食品罪分别判处涉案人员李某(男)、周某(男)、朱某(女)3人有期徒刑3年、1年6个月、1年,并处罚金10万元、9万元、9万元。 案例2:王来福生产销售有毒有害食品案 2014年8月14日,依法取缔了位于兴庆区大新镇新渠稍十二队王来福无生产许可证生产加工酱油、食醋的黑加工点。其生产的酱油、食醋经检验含有“日落黄”和“敌敌畏”等有毒有害物质。王来福涉嫌刑事犯罪,案件已移送公安机关。 案例3:银川及时雨纯净水公司未经许可从事经营案 2014年10月23日,在对银川及时雨纯净水有限公司进行现场检查时发现,该公司在未取得瓶(桶)装饮用水生产许可证的情况下,从事生产加工纯净水。依据国家《食品安全法》没收相关设备和材料,处以罚款1万元。 案例4:董记凉粉加工店使用不符安全标准原料案 2014年5月7日,对兴庆区董记凉粉加工店进行现场检查时,发现其使用的原料豌豆粉包装物上无厂名、厂址等标识。原料豌豆粉经宁夏食品检测中心检验,不符合国家标准要求,依据国家《食品安全法》没收生产原料豌豆粉228袋,处以罚款3万元。 案例5:蒋存明销售过期食品案 2014年9月17日,蒋存明在兴庆区掌政镇一处库房内,对一批已过保质期食品的生产日期进行涂改、并重新打印新的生产日期。依据国家《食品安全法》没收过期小糕点31箱及相关生产设备,处以罚款1万元。 案例6:德泰永药店从非法渠道购进中药饮片案 2014年4月2日,在对银川德泰永药店进行检查时发现,其销售的柴胡等

违法建筑典型案例

【案情介绍】 原告:李某。 被告:××市××区规划建设局 ××市××区人民法院经审理查明:原告李某于2010年12月在××市××区××镇某处的临时建设用地上搭建鸭棚进行养殖,并××镇土地管理所缴纳了460平方米的临时土地使用管理费230元,但至本案审理之际未办理有关用地审批手续。2013年9月22日,××市××区人民政府办公室发〔2013〕113号《关于加强畜禽养殖污染防治工作的通知》,明确了包括原告鸭棚在内的区域为“禁养区”,并要求“禁养区”内各类畜禽养殖场在2014年底完成关、停、转、迁工作。原告未按通知要求搬迁。2015年6月,被告××区××镇人民政府发出《致“禁养区”内养殖户的一封公开信》,要求包括原告在内的养殖户在2015年10月1日前自行拆除养殖棚屋。2016年1月4日,被告向原告下达了《“禁养区”畜禽棚屋强制拆除通知书》,告知原告因其未在规定期限内自行拆除畜禽养殖棚屋,被告将告知市执法局于近日内将组织人员进行强制拆除。2016年5月4日,××区规划建设局向原告发出《限期拆除决定书》,要求其在2016年5月8日17时前自行拆除违法建设的鸭棚,恢复原状,逾期将依法对其实施处罚。2016年5月15日上午,被告组织人员强制拆除了原告的鸭棚。

原告李某诉称:原告系失地农民,自2000年起开始养鸭。原养鸭场地因汽车城和村建设所需,经相关部门与村委会准许于2010年12月搬至××市××区××镇某处。原告缴纳了管理费用,具有合法手续。2016年5月15日上午8时许,被告在趁原告不在场之机,纠集城建、公安派出所等部门约五十人,擅自非法拆除原告的养鸭场,致使原告的3000余只鸭子大量跑失,损失严重。被告既无权强行拆除原告养鸭场,强制拆除程序又违反法律规定。请求法院依法确认被告拆除原告养鸭场的具体行政行为违法。 被告××市××区建设局辩称:1.原告在“禁养区”内搭建的鸭棚属违法建筑,理应被拆除。2.被告拆除原告违法搭建的鸭棚,有事实和法律依据。被告多次通过原告所在村的村干部做原告自行拆除的思想动员工作,但原告依然无动于衷。被告依照法律规定及相关精神依法拆除了原告的违法建筑。请求法院依法驳回原告的诉讼请求。 【审判】 ××市××区人民法院经审理认为:原告临时使用讼争地块虽然缴纳了土地管理费,但未办理有关用地审批手续,且未经规划主管部门批准即在该地块上自行建造鸭棚进行养殖,违反了《中华人民共和国土地管理法》第五十七条、《中华人民共和国城乡规划法》(以下简称《城乡规划法》)第四十条第一款之规定,在该地块上建设的鸭棚系违法建

12个典型的土地违法案例

黄某破坏耕地案件 基本情况:2007年12月份,黄某在未办理合法用地手续情况下,私自与新丰县黄礤镇良坝村村民签订土地租用合同,租用黄礤镇良坝村下坪的旱地14.8亩(988.4平方米)建设瓷土中转场,造成耕地大量毁坏。该用地不符合土地利用总体规划。 查处情况:新丰县国土资源局巡查发现后,责令黄某停工,但事后继续施工建设。2009年5月,对黄某违法行为进行立案查处。8月,依法作出处理决定:责令黄某恢复土地原貌,并处以每平方米30元,共计296541元的罚款。并依法将此案移送公安机关追究当事人的刑事责任。 李某非法占用集体土地建厂案 基本情况:2008年2月,李某未经依法批准,擅自占用乐昌市乐城街道办事处河南塔头村委会塔头村小组集体山地10.1亩建设混泥土搅拌站,该项目用地不符合乐昌市土地利用总体规划。 查处情况:2009年4月,乐昌市国土资源局对李某非法占用集体山地的行为进行立案查处,并于5月作出行政处罚决定:责令李某退还非法占用的土地,限期拆除在非法占用的土地上新建的搅拌站,恢复土地原状。2009年8月,乐城街道办事处组织行动对李某所建的搅拌站实施强制拆除。目前该地已恢复原状。 官某非法占地建房案件 基本情况:2009年7月,官某未经依法批准,擅自占用陂下村委会新楼村小组瓦厂地段133.8平方米山坡地建房。翁源县国土资源局巡查发现后多次制止无效。该用地不符合土地利用总体规划。 查处情况:2009年9月,翁源县国土资源局对管某非法占地行为依法作出行政处罚决定:责令官某限期拆除在非法占用的土地上新建的建筑物和其它设施,恢复土地原状。由于管某逾期未履行处罚内容,县政府于10月份组织国土、建设、公安、龙仙镇、法院等有关部门实施强制拆除时,又遭到当事人有预谋、有组织的暴力抗法,打伤六个工作人员。目前,官某现已被公安机关刑事拘留,非法建筑已被拆除。 卢某非法占地建塑料加工厂案件 基本情况:仁化县城口镇厚塘村委彭屋一组村民卢某未办理任何合法用地手续,擅自与城口厚塘村委签定用地协议,于2008年2月开始占用城口镇城群大麻溪组林地6.1亩建塑料加工厂,建筑用地面积约2亩。该用地不符合土地利用总体规划。

违法违纪案例心得体会

违法违纪案例心得体会

违法违纪案例心得体会 【篇一:违法违纪案件警示教育心得体会】 违法违纪案件警示教育心得体会 按市局在全局干部中开展以范文鹏违法违纪案件为反面典型的警示教育活动,增强拒腐防变能力的要求,进一步加强对广大党员干部的党性、党风、党纪教育,努力提高各级党员干部抵御风险和拒腐防变的能力范文鹏违法违纪案件为各级领导干部提供了很好的明断得失 的镜子,作为我个人,也从中受到了深刻的教育和警示。思考这个典型案件,我主要从以下几个方面浅谈粗略认识。 一、干部必须树立正确的世界观和坚定正确的理想信念。 毛泽东同志指出:事物发展的根本原因,不是在事物的外部而是在事物的内部。唯物辩证法认为外因是变化的条件,内因是变化的根据,外因通过内因而起作用。范文鹏走上毁灭之路是各种因素综合作用的结果,但其中思想意识的蜕化是内因,也是主要原因。范文鹏从一个党的高级干部堕落为人民的罪人,最根本的原因就是他背弃了正确的理想和信念,放松了学习,忽视了主观世界的自我改造。他作为一名系统地接受过高等教育的领导干部,自以为学历高,文凭硬,知识面广,阅历丰富,觉得不需要再下苦功学习了,即便学一点东西,也只是为了武装嘴巴和用做手电照别人,理论与实际工作相脱节。殊不知对于一个党的领导干部来说,放松思想改造,丧失理想信念,就会失去精神支柱,失去灵魂。“物必自腐而生虫”,这句古训富有很深的哲理。范文鹏的毁灭警示我们,理论上的糊涂就会导致政治上的动摇,政治上的动摇必然失去正确的发展方向,失去健康向上的工作和生活态度,必然栽跟头。一个民族需要一种精神力量,一个人需要有一点崇高的理想和追求,反之就难免会被各种诱 惑所俘虏。

03异常错误处理

异常错误处理 1.编写一段PL/SQL程序,根据输入的员工编号参数,查询并打印员工的姓名,并定义异常处理 declare v_empno emp.empno%type := &empno; v_ename emp.ename%type; begin select ename into v_ename from emp where empno = v_empno; dbms_output.put_line('empno: ' || v_empno || ' --- ' || 'ename: ' || v_ename); exception when no_data_found then dbms_output.put_line(Sqlcode || ' --- ' || SQLERRM); when others then dbms_output.put_line(Sqlcode || ' --- ' || SQLERRM); end; 2.自定义一个异常,根据参数员工编号,查询该员工的姓名,所在部门名称,在本公司服务年限,工资等信息,如果工资小于3000,抛出异常提示信息"smith先生在ACCOUNTING部门白吃了2.3333年的咸盐"; declare v_empno emp.empno%type := &empno; Type emp_info_type is record ( v_ename emp.ename%type, v_dname dept.dname%type, v_service number(2), v_sal emp.sal%type ); v_emp_info emp_info_type; myexception exception; begin

12个典型的土地违法案例

5.方茴说:“那时候我们不说爱,爱是多么遥远、多么沉重的字眼啊。我们只说喜欢,就算喜欢也是偷偷摸摸的。” 6.方茴说:“我觉得之所以说相见不如怀念,是因为相见只能让人在现实面前无奈地哀悼伤痛,而怀念却可以把已经注定的谎言变成童话。” 7.在村头有一截巨大的雷击木,直径十几米,此时主干上唯一的柳条已经在朝霞中掩去了莹光,变得普普通通了。 8.这些孩子都很活泼与好动,即便吃饭时也都不太老实,不少人抱着陶碗从自家出来,凑到了一起。 9.石村周围草木丰茂,猛兽众多,可守着大山,村人的食物相对来说却算不上丰盛,只是一些粗麦饼、野果以及孩子们碗中少量的肉食。 黄某破坏耕地案件 基本情况:2007年12月份,黄某在未办理合法用地手续情况下,私自与新丰县黄礤镇良坝村村民签订土地租用合同,租用黄礤镇良坝村下坪的旱地14.8亩(988.4平方米)建设瓷土中转场,造成耕地大量毁坏。该用地不符合土地利用总体规划。 查处情况:新丰县国土资源局巡查发现后,责令黄某停工,但事后继续施工建设。2009年5月,对黄某违法行为进行立案查处。8月,依法作出处理决定:责令黄某恢复土地原貌,并处以每平方米30元,共计296541元的罚款。并依法将此案移送公安机关追究当事人的刑事责任。 李某非法占用集体土地建厂案 基本情况:2008年2月,李某未经依法批准,擅自占用乐昌市乐城街道办事处河南塔头村委会塔头村小组集体山地10.1亩建设混泥土搅拌站,该项目用地不符合乐昌市土地利用总体规划。 查处情况:2009年4月,乐昌市国土资源局对李某非法占用集体山地的行为进行立案查处,并于5月作出行政处罚决定:责令李某退还非法占用的土地,限期拆除在非法占用的土地上新建的搅拌站,恢复土地原状。2009年8月,乐城街道办事处组织行动对李某所建的搅拌站实施强制拆除。目前该地已恢复原状。 官某非法占地建房案件 基本情况:2009年7月,官某未经依法批准,擅自占用陂下村委会新楼村小组瓦厂地段133.8平方米山坡地建房。翁源县国土资源局巡查发现后多次制止无效。该用地不符合土地利用总体规划。 查处情况:2009年9月,翁源县国土资源局对管某非法占地行为依法作出行政处罚决定:责令官某限期拆除在非法占用的土地上新建的建筑物和其它设施,恢复土地原状。由于管某逾期未履行处罚内容,县政府于10月份组织国土、建设、公安、龙仙镇、法院等有关部门实施强制拆除时,又遭到当事人有预谋、有组织的暴力抗法,打伤六个工作人员。目前,官某现已被公安机关刑事拘留,非法建筑已被拆除。 卢某非法占地建塑料加工厂案件 基本情况:仁化县城口镇厚塘村委彭屋一组村民卢某未办理任何合法用地手续,擅自与城口厚塘村委签定用地协议,于2008年2月开始占用城口镇城群大麻溪组林地6.1亩建塑料加工厂,建筑用地面积约2亩。该用地不符合土地利用总体规划。

C异常处理(精)

#include "stdafx.h" #include #include #include // 内存泄露检测机制 #define _CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new(_NORMAL_BLOCK, __FILE__, __LINE__ #endif // 自定义异常类 class MyExcepction { public: // 构造函数,参数为错误代码 MyExcepction(int errorId { // 输出构造函数被调用信息 std::cout << "MyExcepction is called" << std::endl; m_errorId = errorId; } // 拷贝构造函数 MyExcepction( MyExcepction& myExp { // 输出拷贝构造函数被调用信息 std::cout << "copy construct is called" << std::endl; this->m_errorId = myExp.m_errorId; }

~MyExcepction( { // 输出析构函数被调用信息 std::cout << "~MyExcepction is called" << std::endl; } // 获取错误码 int getErrorId( { return m_errorId; } private: // 错误码 int m_errorId; }; int main(int argc, char* argv[] { // 内存泄露检测机制 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ; // 可以改变错误码,以便抛出不同的异常进行测试 int throwErrorCode = 110; std::cout << " input test code :" << std::endl; std::cin >> throwErrorCode; try { if ( throwErrorCode == 110 { MyExcepction myStru(110;

相关主题
文本预览
相关文档 最新文档