编译器如何实现异常处理

编译器如何实现异常处理
编译器如何实现异常处理

C 编译器如何实现异常处理

C++编译器如何实现异常处理

转自:原文出处:How aC++compiler implements exception handling译者注:本文在网上已经有几个译本,但都不完整,所以我决定自己把它翻译过来。虽然力求信、雅、达,但鉴于这是我的第一次翻译经历,不足之处敬请谅解并指出。与传统语言相比,C++的一项革命性创新就是它支持异常处理。传统的错误处理方式经常满足不了要求,而异常处理则是一个极好的替代解决方案。它将正常代码和错误处理代码清晰的划分开来,程序变得非常干净并且容易维护。本文讨论了编译器如何实现异常处理。我将假定你已经熟悉异常处理的语法和机制。本文还提供了一个用于VC++的异常处理库,要用库中的处理程序替换掉VC++提供的那个,你只需要调用下面这个函数:

install_my_handler();之后,程序中的所有异常,从它们被抛出到堆栈展开(stack unwinding),再到调用catch块,最后到程序恢复正常运行,都将由我的异常处理库来管理。与其它C++特性一样,C++标准并没有规定编译器应该如何来实现异常处理。这意味着每一个编译器的提供商都可以用它们认为恰当的方式来实现它。下面我会描述一下VC++是怎么做的,但即使你使用其它的编译器或操作系统①,本文也应该会是一篇很好的学习材料。VC++的实现方式是以windows系统的结构化异常处理(SEH)②为基础的。结构化异常处理-概述在本文的讨论中,我认为异常或者是被明确的抛出的,或者是由于除零溢出、空指针访问等引起的。当它发生时会产生一个中断,接下来控制权就会传递到操作系统的手中。操作系统将调用异常处理程序,检查从异常发生位置开始的函数调用序列,进行堆栈展开和控制权转移。Windows定义了结构"EXCEPTION_REGISTRATION",使我们能够向操作系统注册自己的异常处理程序。

struct EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION*prev;

DWORD handler;

};注册时,只需要创建这样一个结构,然后把它的地址放到FS段偏移0的位置上去就行了。下面这句汇编代码演示了这一操作:

mov FS:[0],exc_regp prev字段用于建立一个EXCEPTION_REGISTRATION结构的链表,每次注册新的EXCEPTION_REGISTRATION时,我们都要把原来注册的那个的地址存到prev中。那么,那个异常回调函数长什么样呢?在excpt.h中,windows 定义了它的原形:

EXCEPTION_DISPOSITION(*handler)(

_EXCEPTION_RECORD*ExcRecord,

void*EstablisherFrame,

_CONTEXT*ContextRecord,

void*DispatcherContext);不要管它的参数和返回值,我们先来看一个简单的例子。下面的程序注册了一个异常处理程序,然后通过除以零产生了一个异常。异常处理程序捕获了它,打印了一条消息就完事大吉并退出了。

#include iostream

#include windows.h using std:cout;

using std:endl;

struct EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION*prev;

DWORD handler;

};

EXCEPTION_DISPOSITION myHandler(

_EXCEPTION_RECORD*ExcRecord,

void*EstablisherFrame,

_CONTEXT*ContextRecord,

void*DispatcherContext)

cout"In the exception handler"endl;

cout"Just ademo.exiting."endl;

exit(0);

return ExceptionContinueExecution;//不会运行到这

int g_div=0;

void bar()

//初始化一个EXCEPTION_REGISTRATION结构

EXCEPTION_REGISTRATION reg,*preg=

reg.handler=(DWORD)myHandler;

//取得当前异常处理链的"头"

DWORD prev;

_asm mov EAX,FS:[0]

mov prev,EAX reg.prev=(EXCEPTION_REGISTRATION*)prev;

//注册!

_asm mov EAX,preg mov FS:[0],EAX

//产生一个异常

int j=10/g_div;//异常,除零溢出

int main()

bar();

return 0;

/*---输出---

In the exception handler Just ademo.exiting.

---*/注意EXCEPTION_REGISTRATION必须定义在栈上,并且必须位于比上一个结点更低的内存地址上,Windows对此有严格要求,达不到的话,它就会立刻终止进程。函数和堆栈堆栈是用来保存局部对象的连续内存区。更明确的说,每个函数都有一个相关的栈桢(stack frame)来保存它所有的局部对象和表达式计算过程中用到的临时对象,至少理论上是这样的。但现实中,编译器经常会把一些对象放到寄存器中以便能以更快的速度访问。堆栈是一个处理器(CPU)层次的概念,为了操纵它,处理器提供了一些专用的寄存器和指令。图1是一个典型的堆栈,它示出了函数foo调用bar,bar又调用widget时的情景。请注意堆栈是向下增长的,这意味着新压入的项的地址低于原有项的地址。通常编译器使用EBP寄存器来指示当前活动的栈桢。本例中,CPU正在运行widget,所以图中的EBP指向了widget的栈桢。编译器在编译时将所有局部对象解析成相对于栈桢指针(EBP)的固定偏移,函

数则通过栈桢指针来间接访问局部对象。举个例子,典型的,widget访问它的局部变量时就是通过访问栈桢指针以下的、有着确定位置的几个字节来实现的,比如说EBP-24。上图中也画出了ESP寄存器,它叫栈指针,指向栈的最后一项。在本例中,ESP指着widget的栈桢的末尾,这也是下一个栈桢(如果它被创建的话)的开始位置。处理器支持两种类型的栈操作:压栈(push)和弹栈(pop)。比如,

pop EAX的作用是从ESP所指的位置读出4字节放到EAX寄存器中,并把ESP加上(记住,栈是向下增长的)4(在32位处理器上);类似的,

push EBP的作用是把ESP减去4,然后将EBP的值放到ESP指向的位置中去。编译器编译一个函数时,会在它的开头添加一些代码来为其创建并初始化栈桢,这些代码被称为序言(prologue);同样,它也会在函数的结尾处放上代码来清除栈桢,这些代码叫做尾声(epilogue)。一般情况下,序言是这样的:

Push EBP;把原来的栈桢指针保存到栈上

Mov EBP,ESP;激活新的栈桢

Sub ESP,10;减去一个数字,让ESP指向栈桢的末尾第一条指令把原来的栈桢指针EBP保存到栈上;第二条指令通过让EBP指向主调函数的EBP的保存位置来激活被调函数的栈桢;第三条指令把ESP减去了一个数字,这样ESP就指向了当前栈桢的末尾,而这个数字是函数要用到的所有局部对象和临时对象的大小。编译时,编译器知道函数的所有局部对象的类型和"体积",所以,它能很容易的计算出栈桢的大小。尾声所做的正好和序言相反,它必须把当前栈桢从栈上清除掉:

Mov ESP,EBP Pop EBP;激活主调函数的栈桢

Ret;返回主调函数它让ESP指向主调函数的栈桢指针的保存位置(也就是被调函数的栈桢指针指向的位置),弹出EBP从而激活主调函数的栈桢,然后返回主调函数。一旦CPU遇到返回指令,它就要做以下两件事:把返回地址从栈中弹出,然后跳转到那个地址去。返回地址是主调函数执行call指令调用被调函数时自动压栈的。Call指令执行时,会先把紧随在它后面的那条指令的地址(被调函数的返回地址)压入栈中,然后跳转到被调函数的开始位置。图2更详细的描绘了运行时的堆栈。如图所示,主调函数把被调函数的参数也压进了堆栈,所以参数也是栈桢的一部分。函数返回后,主调函数需要移除这些参数,它通过把所有参数的总体积加到ESP上来达到目的,而这个体积可以在编译时知道:

Add ESP,args_size当然,也可以把参数的总体积写在被调函数的返回指令的后面,让被调函数去移除参数,下面的指令就在返回主调函数前从栈中移去了24个字节:

Ret 24取决于被调函数的调用约定(call convention),这两种方式每次只能用一个。你还要注意的是每个线程都有自己独立的堆栈。C++和异常回忆一下我在第一节中介绍的EXCEPTION_REGISTRATION结构,我们曾用它向操作系统注册了发生异常时要被调用的回调函数。VC++也是这么做的,不过它扩展了这个结构的语义,在它的后面添加了两个新字段:

struct EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION*prev;

DWORD handler;

int id;

DWORD ebp;

};VC++会为绝大部分函数③添加一个EXCEPTION_REGISTRATION类型的局部变量,它的最后一个字段(ebp)与栈桢指针指向的位置重叠。函数的序言创建这个结构并把它注册给操作系统,尾声则恢复主调函数的EXCEPTION_REGISTRATION。id字段的意义我将在下一节介绍。VC++编译函数时会为它生成两部分数据:a)异常回调函数b)一个包含函数重要信息的数据结构,这些信息包括catch块、这些块的地址和这些块所关心的异常的类型等等。我把这个结构称为funcinfo,有关它的详细讨论也在下一节。图3是考虑了异常处理之后的运行时堆栈。widget的异常回调函数位于由FS:[0]指向的异常处理链的开始位置(这是由widget的序言设置的)。异常处理程序把widget的funcinfo结构的地址交给函数

__CxxFrameHandler,__CxxFrameHandler会检查这个结构看函数中有没有catch 块对当前的异常感兴趣。如果没有的话,它就返回ExceptionContinueSearch给操作系统,于是操作系统会从异常处理链表中取得下一个结点,并调用它的异常处理程序(也就是调用当前函数的那个函数的异常处理程序)。这一过程将一直进行下去--直到处理程序找到一个能处理当前异常的catch块为止,这时它就不再返回操作系统了。但是在调用catch块之前(由于有funcinfo结构,所以知道catch块的入口,参见图3),必须进行堆栈展开,也就是清理掉当前函数的栈桢下面的所有其他的栈桢。这个操作稍微有点复杂,因为:异常处理程序必须找到异常发生时生存在这些栈桢上的所有局部对象,并依次调用它们的析构函数。后面我将对此进行详细介绍。异常处理程序把这项工作委托给了各个栈桢自己的异常处理程序。从FS:[0]指向的异常处理链的第一个结点开始,它依次调用每个结点的处理程序,告诉它堆栈正在展开。与之相呼应,这些处理程序会调用每个局部对象的析构函数,然后返回。此过程一直进行到与异常处理程序自身相对应的那个结点为止。由于catch块是函数的一部分,所以它使用的也是函数的栈桢。因此,在调用catch 块之前,异常处理程序必须激活它所隶属的函数的栈桢。其次,每个catch块都只接受一个参数,其类型是它希望捕获的异常的类型。异常处理程序必须把异常对象本身或者是异常对象的引用拷贝到catch块的栈桢上,编译器在funcinfo中记录了相关信息,处理程序根据这些信息就能知道到哪去拷贝异常对象了。拷贝完异常并激活栈桢后,处理程序将调用catch块。而catch块将把控制权下一步要转移到

的地址返回来。请注意:虽然这时堆栈已经展开,栈桢也都被清除了,但它们占据的内存空间并没有被覆盖,所有的数据都还好好的待在栈上。这是因为异常处理程序仍在执行,象其他函数一样,它也需要栈来存放自己的局部对象,而其栈桢就位于发生异常的那个函数的栈桢的下面。catch块返回以后,异常处理程序需要"杀掉"异常对象。此后,它让ESP指向目标函数(控制权要转移到的那个函数)的栈桢的末尾--这样就把(包括它自己的在内的)所有栈桢都删除了,然后再跳转到catch 块返回的那个地址去,就胜利的完成整个异常处理任务了。但它怎么知道目标函数的栈桢末尾在哪呢?事实上它没法知道,所以编译器把这个地址保存到了栈桢上(由前言来完成),如图3所示,栈桢指针EBP下面第16个字节就是。当然,catch块也可能抛出新异常,或者是将原来的异常重新抛出。处理程序必须对此有所准备。如果是抛出新异常,它必须杀掉原来的那个;而如果是重新抛出原来的异常,它必须能继续传播(propagate)这个异常。这里我要特别强调一点:由于每个线程有自己独立的堆栈,所以每个线程也都有自己独立的、由FS:[0]指向的

EXCEPTION_REGISTRATION链。C++和异常-2图4是funcinfo的布局,注意这里的字段名可能与VC++编译器实际使用的不完全一致,而且我也只给出了和我们的讨论相关的字段。堆栈展开表(unwind table)的结构留到下节再讨论。异常处理程序在函数中查找catch块时,它首先要判断异常发生的位置是否在当前函数(发生异常的那个函数)的一个try块中。是则查找与此try块相关的catch块表,否则直接返回。先来看看它怎样找try块。编译时,编译器给每个try块都分配了start id和end id。通过funcinfo结构,异常处理程序可以访问这两个id,见图4。编译器为函数中的每个try块都生成了相关的数据结构。上一节中,我说过VC++给EXCEPTION_REGISTRATION结构加上了一个id字段。回忆一下图3,这个结构位于函数的栈桢上。异常发生时,处理程序读出这个值,看它是否在try块的两个id 确定的区间[start id,end id]中。是的话,异常就发生在这个try块中;否则继续查看try块表中的下一个try块。谁负责更新id的值,它的值又应该是什么呢?原来,编译器会在函数的多个位置安插代码来更新id的值,以反应程序的实时运行状态。比如说,编译器会在进入try块的地方加上一条语句,把try块的start id写到栈桢上。找到try块后,处理程序就遍历与其关联的catch块表,看是否有对当前异常感兴趣的catch块。在try块发生嵌套时,异常将既源于内层try 块,也源于外层try块。这种情况下,处理程序应该按先内后外的顺序查找catch 块。但它其实没必要关心这些,因为,在try块表中,VC++总是把内层try块放在外层try块的前面。异常处理程序还有一个难题就是"如何根据catch块的相关数据结构判断这个catch块是否愿意处理当前异常"。这是通过比较异常的类型和catch块的参数的类型来完成的。例如下面这个程序:

void foo()

try throw E();

catch(H)

//.

如果H和E的类型完全相同的话,catch块就要捕获这个异常。这意味着处理程序必须在运行时进行类型比较,对C等语言来说,这是不可能的,因为它们无法在运行时得到对象的类型。C++则不同,它有了运行时类型识别(runtime type identification,RTTI),并提供了运行时类型比较的标准方法。C++在标准头文件中定义了type_info类,它能在运行时代表一个类型。catch块数据结构的第二个字段(ptype_info,见图4)是一个指向type_info结构的指针,它在运行时就代表catch块的参数类型。type_info也重载了==运算符,能够指出两种类型是否完全相同。这样,异常处理程序只要比较(调用==运算符)catch块参数的type_info(可以通过catch块的相关数据结构来访问)和异常的type_info是否相同,就能知道catch块是不是愿意捕获当前异常了。catch块的参数类型可以通过funcinfo结构得到,但异常的type_info从哪来呢?当编译器碰到

throw E();这条语句时,它会为异常生成一个excpt_info结构,如图5所示。还是要提醒你注意这里用的名字可能与VC++使用的不一致,而且仍然只有与我们的讨论相关的字段。从图中可以看出,异常的type_info可以通过excpt_info结构得到。由于异常处理程序需要拷贝异常对象(在调用catch块之前),也需要消除掉它(在调用catch块之后),所以编译器在这个结构中同时提供了异常的拷贝构造函数、大小和析构函数的信息。在catch块的参数是基类,而异常是派生类时,异常处理程序也应该调用catch块。然而,这种情况下,比较它们的type_info绝对是不相等,因为它们本来就不是相同的类型。而且,type_info类也没有提供任何其他函数或运算符来指出一个类是另一个类的基类。但异常处理程序还必须得去调用catch块!为了解决这个问题,编译器只能为处理程序提供更多的信息:如果异常是派生类,那么etypeinfo_table(通过excpt_info访问)将包含多个指向

etype_info(扩展了type_info,这个名字是我启的)的指针,它们分别指向了各个基类的etype_info。这样,处理程序就可以把catch块的参数和所有这些

type_info比较,只要有一个相同,就调用catch块。在结束这一部分之前,还有最后一个问题:异常处理程序是怎么知道异常和excpt_info结构的?下面我就要回答这个问题。VC++会把throw语句翻译成下面的样子:

//throw E();//编译器会为E生成excpt_info结构

E e=E();//在栈上创建异常

_CxxThrowException(&e,E_EXCPT_INFO_ADDR);__CxxThrowException会把控制权连带它的两个参数都交给操作系统(控制权转移是通过软件中断实现的,请参见RaiseException)。而操作系统,在为调用异常回调函数做准备时,会把这两个参数打包到一个_EXCEPTION_RECORD结构中。接着,它从EXCEPTION_REGISTRATION 链表的头结点(由FS:[0]指向)开始,依次调用各节点的异常处理程序。而且,指向当前EXCEPTION_REGISTRATION结构的指针也会作为异常处理程序的第二个参数出现。前面已经说过,VC++中的每个函数都在栈上创建并注册了

EXCEPTION_REGISTRATION结构。所以传递这个参数可以让处理程序知道很多重要信息,比如说:EXCEPTION_REGISTRATION的id字段(用于查找catch块)、函数的

栈桢(用于清理栈桢)和EXCEPTION_REGISTRATION结点在异常链表中的位置(用于堆栈展开)等。第一个参数是指向_EXCEPTION_RECORD结构的指针,通过它可以找到异常和它的excpt_info结构。下面是excpt.h中定义的异常回调函数的原型:

EXCEPTION_DISPOSITION(*handler)(

_EXCEPTION_RECORD*ExcRecord,

void*EstablisherFrame,

_CONTEXT*ContextRecord,

void*DispatcherContext);后两个参数和我们的讨论关系不大。函数的返回值是一个枚举类型(也在excpt.h中定义),我前面已经说过,如果处理程序找不到catch块,它就会向系统返回ExceptionContinueSearch,对本文而言,我们只要知道这一个返回值就行了。_EXCEPTION_RECORD结构是在winnt.h中定义的:

struct _EXCEPTION_RECORD DWORD ExceptionCode;

DWORD ExceptionFlags;

_EXCEPTION_RECORD*ExcRecord;

PVOID ExceptionAddress;

DWORD NumberParameters;

DWORD ExceptionInformation[15];

}EXCEPTION_RECORD;ExceptionInformation数组中元素的个数和类型取决于ExceptionCode字段。如果是C++异常(异常代码是0xe06d7363,源于throw语句),那么数组中将包含指向异常和excpt_info结构的指针;如果是其他异常,那数组中基本上就不会有什么内容,这些异常包括除零溢出、访问违例等,你可以在winnt.h中找到它们的异常代码。ExceptionFlags字段用于告诉异常处理程序应该采取什么操作。如果它是EH_UNWINDING(见Except.inc),那是说堆栈正在展开,这时,处理程序要清理栈桢,然后返回。否则处理程序应该在函数中查找catch块并调用它。清理栈桢意味着必须找到异常发生时生存在栈桢上的所有局部对象,并调用其析构函数,下一节我们将就此进行详细讨论。清理栈桢C++标准明确指出:堆栈展开工作必须调用异常发生时所有生存的局部对象的析构函数。如下面的代码:

int g_i=0;

void foo()

T o1,o2;

T o3;

10/g_i;//这里会发生异常

T o4;

//.

foo有o1、o2、o3、o4四个局部对象,但异常发生时,o3已经"死亡",o4还未"出生",所以异常处理程序应该只调用o1和o2的析构函数。前面已经说过,编译器会在函数的很多地方安插代码来记录当前的运行状态。实际上,编译器在函数中设置了一些关键区域,并为它们分配了id,进入关键区域时要记录它的id,退出时恢复前一个id。try块就是一个例子,其id就是start id。所以,在try块的入口,编译器会把它的start id记到栈桢上去。局部对象从创建到销毁也确定了一个关键区域,或者,换句话说,编译器给每个局部对象分配了唯一的id,例如下面的程序:

void foo()

T t1;

//.

编译器会在t1的定义后面(也就是t1创建以后),把它的id写到栈桢上:

void foo()

T t1;

_id=t1_id;//编译器插入的语句

//.

上面的_id是编译器偷偷创建的局部变量,它的位置与EXCEPTION_REGISTRATION 的id字段重叠。类似的,在调用对象的析构函数前,编译器会恢复前一个关键区域的id。清理栈桢时,异常处理程序读出id的值(通过EXCEPTION_REGISTRATION 结构的id字段或栈桢指针EBP下面的4个字节来访问)。这个id可以表明,函数在运行到与它相关联的那个点之前没有发生异常。所有在这一点之前定义的对象都已初始化,应该调用这些对象中的一部分或全部对象的析构函数。请注意某些对象

是属于子块(如前面代码中的o3)的,发生异常时可能已经销毁了,不应该调用它们的析构函数。编译器还为函数生成了另一个数据结构--堆栈展开表(unwindtable,我启的名字),它是一个unwind结构的数组,可通过funcinfo来访问,如图4所示。函数的每个关键区域都有一个unwind结构,这些结构在展开表中出现的次序和它们所对应的区域在函数中的出现次序完全相同。一般unwind 结构也会关联一个对象(别忘了,每个对象的定义都开辟了关键区域,并有id与其对应),它里面有如何销毁这个对象的信息。每当编译器碰到对象定义,它就生成一小段代码,这段代码知道对象在栈桢上的地址(就是它相对于栈桢指针的偏移),并能销毁它。unwind结构中有一个字段用于保存这段代码的入口地址:

typedef void(*CLEANUP_FUNC)();

struct unwind int prev;

CLEANUP_FUNC cf;

};try块对应的unwind结构的cf字段是空值NULL,因为没有与它对应的对象,所以也没有东西需要它去销毁。通过prev字段,这些unwind结构也形成了一个链表。异常处理程序清理栈桢时,会读取当前的id值,以它为索引取得展开表中对应的项,并调用其第二个字段指向的清理代码,这样,那个与之关联的对象就被销毁了。然后,处理程序将以当前unwind结构的prev字段为索引,继续在展开表中找下一个unwind结构,调用其清理代码。这一过程将一直重复,直到链表的结尾(prev的值是-1)。图6画出了本节开始时提到的那段代码的堆栈展开表。现在把new运算符也加进来,对于下面的代码:

T*p=new T();系统会首先为T分配内存,然后调用它的构造函数。所以,如果构造函数抛出了异常,系统就必须释放这些内存。因此,动态创建那些拥有"有为的构造函数"的类型时,VC++也为new运算符分配了id,并且堆栈展开表中也有与其对应的项,其清理代码将释放分配的内存空间。调用构造函数前,编译器把new运算符的id存到EXCEPTION_REGISTRATION结构中,构造函数顺利返回后,它再把

id恢复成原来的值。更进一步说,构造函数抛出异常时,对象可能刚刚构造了一部分,如果它有子成员对象或子基类对象,并且发生异常时它们中的一部分已经构造完成的话,就必须调用这些对象的析构函数。和普通函数一样,编译器也给构造函数生成了相关的数据来帮助完成这个任务。展开堆栈时,异常处理程序调用的是用户定义的析构函数,这一点你必须注意,因为它也有可能抛出异常!C++标准规定堆栈展开过程中,析构函数不能抛出异常,否则系统将调用std:terminate。实现本节我们讨论其他三个有待详细解释的问题:a)如何安装异常处理程序

b)catch块重新抛出异常或抛出新异常时应该如何处理c)如何对所有线程提供异常处理支持随同本文,有一个演示项目,查看其中的readme.txt文件可以得到一些编译方面的帮助①。第一项任务是安装异常处理程序,也就是把VC++的处理程序替换掉。从前面的讨论中,我们已经清楚地知道__CxxFrameHandler函数是VC++所有异常处理工作的入口。编译器为每个函数都生成一段代码,它们在发生异常时被

调用,把相应的funcinfo结构的指针交给__CxxFrameHandler。

install_my_handler()函数会改写__CxxFrameHandler的入口处的代码,让程序跳转到my_exc_handler()函数。不过,__CxxFrameHandler位于只读的内存页,对它的任何写操作都会导致访问违例,所以必须首先用VirtualProtectEx把该内存页的保护方式改成可读写,等改写完毕后,再改回只读。写入的数据是一个

jmp_instr结构。

//install_my_handler.cpp

#include windows.h

#include"install_my_handler.h"

//C++默认的异常处理程序

extern"C"

EXCEPTION_DISPOSITION __CxxFrameHandler(

struct _EXCEPTION_RECORD*ExceptionRecord,

void*EstablisherFrame,

struct _CONTEXT*ContextRecord,

void*DispatcherContext

);

namespace char cpp_handler_instructions[5];

bool saved_handler_instructions=false;

namespace my_handler

//我的异常处理程序EXCEPTION_DISPOSITION my_exc_handler(

struct _EXCEPTION_RECORD*ExceptionRecord,

void*EstablisherFrame,

struct _CONTEXT*ContextRecord,

void*DispatcherContext

)throw();

#pragma pack(push,1)

struct jmp_instr unsigned char jmp;

DWORD offset;

};

#pragma pack(pop)

bool WriteMemory(void*loc,void*buffer,int size)

HANDLE hProcess=GetCurrentProcess();

//把包含内存范围[loc,loc+size]的页面的保护方式改成可读写

DWORD old_protection;

BOOL

ret=VirtualProtectEx(hProcess,loc,size,PAGE_READWRITE,&old_protection);if(ret==FALSE)

return false;

ret=WriteProcessMemory(hProcess,loc,buffer,size,NULL);

//恢复原来的保护方式

DWORD o2;

VirtualProtectEx(hProcess,loc,size,old_protection,&o2);

return(ret==TRUE);

bool ReadMemory(void*loc,void*buffer,DWORD size)

HANDLE hProcess=GetCurrentProcess();

DWORD bytes_read=0;

BOOL ret=ReadProcessMemory(hProcess,loc,buffer,size,&bytes_read);

return(ret==TRUE&&bytes_read==size);

bool install_my_handler()

void*my_hdlr=my_exc_handler;void*cpp_hdlr=__CxxFrameHandler;

jmp_instr jmp_my_hdlr;

jmp_my_hdlr.jmp=0xE9;

//从__CxxFrameHandler+5开始计算偏移,因为jmp指令长5字节

jmp_my_hdlr.offset=reinterpret_cast(my_hdlr)-

(reinterpret_cast(cpp_hdlr)+5);

if(!saved_handler_instructions)

if(!

ReadMemory(cpp_hdlr,cpp_handler_instructions,sizeof(cpp_handler_instruct ions)))

return false;

saved_handler_instructions=true;

return WriteMemory(cpp_hdlr,&jmp_my_hdlr,sizeof(jmp_my_hdlr));

bool restore_cpp_handler()

if(!saved_handler_instructions)

return false;

else void*loc=__CxxFrameHandler;

return

WriteMemory(loc,cpp_handler_instructions,sizeof(cpp_handler_instructions ));

编译指令#pragma pack(push,1)告诉编译器不要在jmp_instr结构中填充任何用于对齐的空间。没有这条指令,jmp_instr的大小将是8字节,而我们需要它是5字节。现在重新回到异常处理这个主题上来。调用catch块时,它可能重新抛出异常或抛出新异常。前一种情况下,异常处理程序必须继续传播(propagate)当前异常;后一种情况下,它需要在继续之前销毁原来的异常。此时,处理程序要面对两个难题:"如何知道异常是源于catch块还是程序的其他部分"和"如何跟踪原来的异常"。我的解决方法是:在调用catch块之前,把当前异常保存在

exception_storage对象中,并注册一个专用于catch块的异常处理程序--

catch_block_protector。调用get_exception_storage()函数,就能得到exception_storage对象:

exception_storage*p=get_exception_storage();

p-set(pexc,pexc_info);注册catch_block_protector;调用catch块;//.这样,当catch块(重新)抛出异常时,程序将会执行catch_block_protector。如果是抛出了新异常,这个函数可以从exception_storage对象中分离出前一个异常并销毁它;如果是重新抛出原来的异常(可以通过ExceptionInformation数组的前两个元素知道是新异常还是旧异常,后一种情况下着两个元素都是0,参见下面的代码),就通过拷贝ExceptionInformation数组来继续传播它。下面的代码就是catch_block_protector()函数的实现。

//---

//如果这个处理程序被调用了,可以断定是catch块(重新)抛出了异常。

//异常处理程序(my_handler)在调用catch块之前注册了它。其任务是判断

//catch块抛出了新异常还是重新抛出了原来的异常,并采取相应的操作。

//在前一种情况下,它需要销毁传递给catch块的前一个异常对象;在后一种

//情况下,它必须找到原来的异常并将其保存到ExceptionRecord中供异常

//处理程序使用。

//---

EXCEPTION_DISPOSITION catch_block_protector(

_EXCEPTION_RECORD*ExceptionRecord,

void*EstablisherFrame,

struct _CONTEXT*ContextRecord,

void*DispatcherContext

)throw()

EXCEPTION_REGISTRATION*pFrame;

pFrame=reinterpret_cast EXCEPTION_REGISTRATION*(EstablisherFrame);

if(!(ExceptionRecord-

ExceptionFlags&(_EXCEPTION_UNWINDING|_EXCEPTION_EXIT_UNWIND))) void*pcur_exc=0,*pprev_exc=0;

const excpt_info*pexc_info=0,*pprev_excinfo=0;

exception_storage*p=get_exception_storage();

pprev_exc=p-get_exception();

pprev_excinfo=p-get_exception_info();

p-set(0,0);

bool cpp_exc=ExceptionRecord-ExceptionCode==MS_CPP_EXC;

get_exception(ExceptionRecord,&pcur_exc);

get_excpt_info(ExceptionRecord,&pexc_info);

if(cpp_exc&&0==pcur_exc&&0==pexc_info)//重新抛出

ExceptionRecord-ExceptionInformation[1]=reinterpret_cast

DWORD(pprev_exc);

ExceptionRecord-ExceptionInformation[2]=reinterpret_cast

DWORD(pprev_excinfo);

else exception_helper:destroy(pprev_exc,pprev_excinfo);

return ExceptionContinueSearch;

下面是get_exception_storage()函数的一个实现:

exception_storage*get_exception_storage()

static exception_storage es;

return&es;

在单线程程序中,这是一个完美的实现。但在多线程中,这就是个灾难了,想象一下多个线程访问它,并把异常对象保存在里面的情景吧。由于每个线程都有自己的堆栈和异常处理链,我们需要一个线程安全的get_exception_storage实现:每个线程都有自己单独的exception_storage,它在线程启动时被创建,并在结束时被销毁。Windows提供的线程局部存储(thread local storage,TLS)可以满足这个要求,它能让每个线程通过一个全局键值来访问为这个线程所私有的对象副本,这是通过TlsGetValue()和TlsSetValue这两个API来完成的。Excptstorage.cpp中给出了get_exception_storage()函数的实现。它会被编译成动态链接库,因为我们可以籍此知道线程的创建和退出--系统在这两种情况下都会调用所有(当前进程加载的)dll的DllMain()函数,这让我们有机会创建特定于线程的数据,也就是exception_storage对象。

//excptstorage.cpp

#include"excptstorage.h"

#include windows.h namespace DWORD dwstorage;

namespace my_handler

__declspec(dllexport)exception_storage*get_exception_storage()throw()

void*p=TlsGetValue(dwstorage);

return reinterpret_cast exception_storage*(p);

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

using my_handler:exception_storage;

exception_storage*p;

switch(ul_reason_for_call)

case DLL_PROCESS_ATTACH:

//主线程(第一个线程)不会收到DLL_THREAD_ATTACH通知,所以,//与其相关的操作也放在这了

dwstorage=TlsAlloc();

if(-1==dwstorage)

return FALSE;

p=new exception_storage();

TlsSetValue(dwstorage,p);

break;

case DLL_THREAD_ATTACH:

p=new exception_storage();

TlsSetValue(dwstorage,p);

break;

case DLL_THREAD_DETACH:

p=my_handler:get_exception_storage();

delete p;

break;

case DLL_PROCESS_DETACH:

p=my_handler:get_exception_storage();

delete p;

break;

return TRUE;

结论综上所述,异常处理是在操作系统的协助下,由C++编译器和运行时异常处理库共同完成的。注释和参考资料

①本文写作期间,微软发布了Visual Studio 7.0。本文的异常处理库主要是在运行于奔腾处理器的windows2000上使用VC++6.0编译和测试的。但我也在VC++5.0和VC++7.0 beta版上测试过。6.0和7.0之间有一些差别,6.0先把异常(或其引用)拷贝到catch块的栈桢上,然后在调用catch块之前进行堆栈展开;7.0则先进行堆栈展开。在这方面,我的库代码的行为比较接近6.0版。②参见Matt Pietrek发表在MSDN上的文章《structured exception handling》。③如果一个函数既不含try块,也没有定义任何具有"有为的析构函数"的对象,那么编译器将不为它生成用于异常处理的数据。发表于@2010年04月27日14:46:00|||

特别声明:

1:资料来源于互联网,版权归属原作者

2:资料内容属于网络意见,与本账号立场无关

3:如有侵权,请告知,立即删除。

产品质量异常处理流程精

供应商来料异常管理流程 1. 目的: 规范来料产品的异常处理流程控制,提高来料合格率。 2. 范围: 本规范适用于所有外购零部件及外包加工件。 3. 职责与权限: 3.1生技部:负责检测治具的制作。 3.2质量中心:负责来料异常的提出、分析、处理。 3.3生产部:负责来料异常协助处理。 3.4研发部:负责来料异常的分析、处理。 3.5生管部:负责确认来料品上线使用时间。 3.6采购部:负责来料异常与供应商的纠通取得异常的处理。 4. 名词定义: 4.1不合格:未满足产品的质量要求。 4.2 A类:单位产品的极重要质量特性不符合规定,或者单位产品的质量特性极严重不符合规定。 4.3 B类:单位产品的重要质量特性不符合规定,或者单位产品的质量特性严重不符合规定。 4.4 C类:单位产品的一般质量特性不符合规定,或者单位产品的质量特性轻微不符合规定。 5、异常处理流程控制 5.1 IQC依据检验指导书、封样、评估报告等资料检验,发现来料品不满足质量要求。 5.2 IQC将自已判定为不合格的产品经工程师、部门主管核对确实为不合格品。 5.3 IQC 立即填写《供应商异常矫正单》进行处理。 5.4 质量中心主管主导组织针对异常讨论,参与人员:采购、PIE、质量中心经理、研发工程师、研发总监、厂部厂长及其相关人员。 6、异常分类: 6.1 外观不良:表面有划痕、水印、字体不清、表面气泡、砂眼、黑点、缺料、油污、毛刺、变形、色差、氧化及电镀层脱落、标识规格错误、无料号贴纸、无出厂检验报告等。 6.2性能不良:尺寸与图纸不符、适配过大,过小、色温,波长,亮度不符、电压,电流不符等。 7、异常处理方式 7.1将不良品返回供应商进行返工、返修、报废等。

生产异常处理流程

A版 汇签: 制定:审核:批准:修订记录:

1.目的 为了规范产线发生异常时,能及时、准确地反映并能通过相关人员确认、分析、及时解决,确保生产正常进行。 2.适用范围

适用于客户与工厂合作产品之生产线发生的异常现象。 3. 职责 3.1 工厂品质:提出异常问题,确认是否属实。 3.2 工厂工程:负责产线异常分析,找出问题原因,提出改善对策。 3.3 工厂IQC:跟进改善结果及效果确认;对来料进行管控。 3.4 工厂品质:提供异常的最终处理方案,并对改善方案评估/验证;供应商改善报告回复及监控。 3.5 客户项目、结构、工程:负责结构、软/硬件异常问题的解决。 3.6 客户采购:负责来料异常商务方面的处理。 3.7 客户计划:负责异常发生时总体计划的协调和异常发生产生的工时和物料的签合。 3.8 质量总监:让步接收最终审批。 4. 异常处理流程 4.1工厂仓库按客户计划要求根据BOM及套料单领取物料安排生产! 4.2产线在生产中发现产品与样板不符、功能缺失、装配出来的成品达不到标准要求或来料无法使用等现象时, 及时上报IPQC、工厂品质&工程等相关人员确认。 4.2 工厂品质确认异常可接受,通知产线继续生产;如确认异常成立则交工厂工程分析同时开出《生产异常报 告》。 4.3 经工厂工程分析,给出初步分析结果,结果分为工艺问题、设计问题、来料问题。 4.4 由工厂工程分析为工艺问题,由工程辅导产线纠正生产工艺,工厂品质监督确认,产线恢复正常生产。 4.5 经工厂工程初步分析异常属于设计问题,在能力范围内能解决的自行处理,但需将解决办法知会客户,若 无法解决的则书面知会客户品质、项目、结构、计划。由客户计划主导协调客户项目结构分析在30分钟内给出临时处理解决办法,经工厂品质确认合格恢复生产;对于后期的改善对策,由客户品质主导负责协调项目、结构工程等一起实施有效的解决对策并进行验证,得到工厂品质确认方可进行生产安排! 4.6由工厂工程及品质确认异常是来料问题,第一时间以邮件通知客户计划、品质、采购,并要求客户品质在 30分钟内对物料问题给予回复处理意见(临时解决办法),工厂给予相应配合和支持!同时客户品质联系供应商到工厂工厂及时解决,并要求供应商给出不良原因分析及改善报告回复,客户品质对其进行验证,同时要求供应商挑选符合品质标准的物料经品质确认后方可恢复生产。 4.6.1若供应商没在规定时间(原则上要求供应商4小时内)到工厂处理,先由采购或品质与供应商沟通,如 果供应商同意接收工厂工厂挑选并承担其挑选费用和不良物料,产线予以上线生产! 4.6.2 由于A 物料来料不良比例较高,拆修时造成B物料不良,产线立即提报生产异常单和提报预估损耗比例, 让客户品质现场确认,后续以此作为退料依据! 4.7.生产异常时产线处理: 4.7.1当产线单项不良超过20%,通过加工处理,不良率仍超过5%,经与客户计划协商,产线开出异常通知单, 通知停线。工厂计划根据实际情况提报工时损耗及物料损耗明细,让客户计划汇签确认! 4.7.2生产过程中造成A类物料≥1%的损耗,连续二个小时达到此标准产线暂停线待处理,如超1.5%应立即暂 停线待分析处理。 4.7.3生产过程中造成B类物料≥3%的损耗,应立即暂停线待分析处理。 4.7.4生产异常发生时如客户品质有人在工厂由客户品质确认,如无则由工厂品质确认,必须在接到异常半小

车间异常处理流程图

车间异常处理流程图 1、生产计划的异常 如若出现生产计划异常,生产车间应根据计划进行调整,迅速合理的做出工作安排,保证生产效率,确保总产量不变;安排因计划调 整而遗留的产品、半成品、原材料的盘点、入库、清退等处理工作; 安排因计划调整而闲置的人员做前加工工作;安排人员以最快速度做 计划更换的物料、设备等准备工作;利用计划调整的时间做必要的教 育训练。 2、物料计划的异常 接到生产计划后,相关人员要立即确认物料状况,查验物料有无短缺,随时掌控各种物料信息,反馈给相关部门,避免异常的发生; 物料即将告缺前30分钟,用警示灯、电话或书面形式反馈给采购、 资财、生产管理部门;物料告缺前10分钟必须确认物料何时可以接上;如属短暂断料,可安排闲置人员做前加工、整理整顿或其它零星 工作,如断料时间较长,可安排教育训练,或与生管协调做计划变更,安排生产其他产品。 3、设备异常 立即通知工程维修部门协助排除,安排闲置人员整理整顿或做前加工工作。如排除故障需要教长时间的,应与生管部门协调另作安排。 4、制程品质异常 对有品质不良记录的产品,应在产前做好重点管理,异常发生时,迅速用警示灯、电话或其他方式通知品管部及相关部门;协助品管、 责任部门一起研究对策,配合临时对策的实施,以确保生产任务的 达成,在对策实施前,安排闲置人员做前加工或整理整顿工作,如 果异常暂时无法排除时,与生管协调做生产变更。

5此外,如遇到设计工艺异常应迅速通知品管、生技或开发部。 水电异常则要迅速采取措施降低损失,通知工程动力维修部门抢修,对于闲置人员可做其他安排。生产异常排除后,一定要坚持“三不”原则进行处理,以避免类似问题的重复发生。

网上报税操作流程和异常处理(参考)

网上报税操作流程及异常处理 一、网上报税完整业务流程(网上申报→远程抄报税→网上扣款): 1.网上申报 使用“网上申报软件”填写申报表,导出网上“申报文件”上传至陕西省国家税务局“专用发票认证和网上申报受理系统”(网址:,并查看申报结果。(报表填写要准确无误且申报成功,确保申报成功); 2.远程抄报税 进入“增值税防伪开票系统”首先应正常抄税,再点击“远程抄报”模块,依次点击:报税状态→远程报税→报税结果;(必须确保在“报税处理”模块已将本月税抄至IC卡中,才能点击“远程抄报”导航图中的四个图标,每个步骤都有对应提示); 3.网上扣款 进入航天信息申报软件点击办税平台或进入陕西省国家税务局“专用发票认证和网上申报受理系统”(网址:,完成网上扣税工作,扣税成功后进入远程抄报模块再次点击报税状态→远程报税→报税结果→清卡操作;清卡成功后就完成了本月的抄报税工作。 二、网上报税异常处理: 1、远程抄报税比对异常: 企业进入“增值税防伪开票系统”点击“远程抄报”模块的“报税结果”,若提示“错误”,代表申报表填报有误(申报表错误栏次详见错误提示信息),此时,企业和申报软件服务单位联系(使用航天信息申报软件拨打),删除错误申报表。删除后,企业方可再重新进行网上申报、远程抄报税操作。 2、网上扣款异常: 企业登录陕西省国家税务局“专用发票认证和网上申报受理系统(网址:,点击“未缴款信息查询”,再点击“扣款”,若显示“扣款失败”,请按以下程序办理: 1)企业核实是否签订了三方协议,并保证账户余额充足; 2)企业账户若余额充足,需到签订三方协议的银行查询税款是否已被扣除; 3)企业如查询到账户内未扣除税款,需携带当期申报表到税务大厅办理扣缴税款业务。

异常处理流程

异常处理流程及注意事项 1.发现不良; (1)确认所采用标准的完整性和有效性; (2)熟练掌握检验所涉及之相关标准或其他文件; (3)严格按抽样标准取样,注意均匀,来料检验须注意来料的不同时间,批号,生产班次等; (4)了解以往的品质状况及其品质履历; (5)掌握品管之检验技巧; 2.标示,区分,隔离; (1)标示,隔离须涉及到具体的不良品和可疑批次,不合格标示要完整且必要时要口头或书面知会先相关人员,以避免他人 混淆误用为原则; (2)不合格标示,隔离须注明不合格原因,检验员,检验日期,进料检验另须注明检验单号,并知会相关人员; 3.初步分析判断,并知会相关单位及现场领导; (1)确定不良等级,异常比率,影响度和影响面,必要时须及时知会相关单位之人员; (2)针对制程或成品类异常,要及时研拟临时对策; (3)进料之异常可能涉及组装或功能之不良,需通过试组装来确定其严重性和影响度,必要时可请工程部帮忙确认; 4.异常提报; (1)异常提报时要注意时效性和准确性,异常单的填写需准确完

整,成品异常要确认追溯批号,PO#与数量; (2)须标示和提供不良品; (3)会签的填写和勾选须正确完整; 5.跟催各相关单位签单状况,根据会签结果处理异常; (1)品管必须跟催会签状况,有迟迟未签之单位必须及时跟催,如多次跟催无效,可请领导协助,以避免异常处理的时效; (2)有签核S物料时,按S物料作业流程处理,并将处理结果维护到异常单中; (3)当物料急上线,且部门领导有同意采用,而高级主管又不在厂内,无法立即签核S单时,可询问品质经理,先输S物料, 以便后续作业; (4)当会签单位处理意见不一致时,需反映部门领导,并确认最终处理结果; 6.确认处理结果; (1)全检或重工后的,需重新确认品质状况,成品类有拆箱之异常,需填写成品不合格处置报表; (2)S物料须对其品质进行跟踪,有异常要及时提报; 7.追踪改善措施; (1)注意改善措施回文必须由责任单位之领导签核,并且要在7个工作日内完成改善措施回文; 8.确认改善结果; (1)评估改善措施之有效性,必要时须修改相关品质系统文件或

产品异常处理流程

产品异常处理流程 1目的: 为了使品质异常发生时处理过程有据可依有规可循,使重大品质异常能在规定的时间内得到有效改善,防止相同问题重复发生,降低品质成本,确保产品质量符合需求 2范围: 制程控制、出货检验 3定义:重大品质异常是指品质问题严重有必要开具《品质异常联络单》,并由QE/IPQC进行特别 跟进的质量事件 3.1制程外观不良达10%时开具《品质异常联络单》 3.2制程性能不良达5%时开具《品质异常联络单》 3.3制程尺寸不良达3%时开具《品质异常联络单》 3.4制程无作业指导书、无标准或制程条件不能满足工艺需求而导致停线 3.5制程连续3天重复出现的品质问题开具《品质异常联络单》 4运作流程: 4.1在生产制程过程中,当作业人员发现产品出现品质异常时第一时间通知现场IPQC、现场主管予以确认,无误由IPQC开《品质异常联络单》,若IPQC与现场主管对该异常项目发生分歧时则立即报告上级主管予以确认、属实IPQC继续开《品质异常联络单》; 4.2现场IPQC初步分析异常原因(必要时协同工艺、技术一起进行异常原因分析)后,填写 《品质异常联络单》

4.3《品质异常联络单》的填写必须清楚地写明事件发生的日期、时间、地点、批量数、批号、异常数量、不良率、异常状况的描述 及异常原因的分析 4.4由IPQC将《品质异常联络单》送本部门主管审核后,由主 管将《品质异常联络单》统一编号后转送责任部门主管并在《品质 异常跟进表》上签收,相关人员接到联络单后一个工作日之内给与 回复 4.5现场原因分析清楚后,相关责任部门主管针对生产实际状况 制订纠正措施,由责任部门主管将纠正措施规范填入《品质异常联 络单》之纠正措施栏内,现场IPQC进行跟踪验证; 4.6责任部门主管对品质异常的实质原因进行分析并将其填写在《纠正/预防措施报告》对应的原因分析栏中 4.7责任部门主管应在48小时内对《纠正/预防措施报告》的异 常原因做出预防措施, 4.8QE依《品质异常联络单》、《纠正、预防措施报告》进行跟 踪验证、确认效果 4.8.1责任部门是否在规定时限内实施改进措施4.8.2责任部门 是否在规定时限内完成改进措施 4.8.3涉及部门相关人员是否积极配合改进措施的实施; 5奖惩制度:5.1处罚制度: 5.1.1责任人必须在2个工作日内做出改进计划和明确完成时限,否则给以5元/次的处罚; 5.1.2改进措施在限定时限内未能完成给以5元/次的处罚; 5.1.3责任部门未彻底执行改进措施导致改善无效给以责任人10元/次的处罚;5.1.4同一个异常点在同一部门一个月内重复发生5 次或以上给以20元/月的处罚。5.2奖励制度:

品质异常时的处理流程及方法.doc

文件编号 xxxxxx 公司 版次A/0 品质异常处理流程及办法 页码第1 页共3 页编制审核批准实施日期 一、目的: 为了使产品在发生异常情况时能够及时传递并得到有效解决,确保产品质量符合需求。二、适用范围: 所有生产工序 三、品质异常定义 ①根据经验,感觉与正常情况不一样时; ②不良类型第一次发生时; ③相同类型的不合格品连续发生2~3 件的时候; ④不能正确判断产品是否合格的时候; ⑤感觉设备、工装模具有问题时。 四、工作流程 1、操作者在生产作业过程中发现异常时,必须马上停止作业。 2、操作者将异常件暂时存放在返工箱内(兰色),及时向巡检员汇报。严禁操作者自 作主张对异常件进行处理。 3、巡检员按作业指导书标准对异常件进行检查,判定是否合格,初步分析异常产生原 因,填写《品质异常记录表》。 ①判定合格时,操作者可继续生产。 ②判定不合格时,巡检员根据情况确定不合格数量,必要时要求操作者对已加工的产 品进行全检。然后由巡检员进行分类,不合格品放入废品箱(黄色),不良品放入不良品箱(白色),把返工品放入返工品箱(兰色)。待异常原因消除后操作者方可进行生产作业。若异常原因涉及设备、工装问题,巡检员应及时通知生产部门协调处理。 ③巡检员无法判定时是否合格或异常原因时,应及时通知质量管理人员进行确认。 4、质量管理人员根据有无必要,成立对策小组,尽快采取临时措施恢复生产,尽快找 到对策解决根部问题。 四、相关表单 1、《品质异常记录表》QR/C.07-08

品质异常记录表 QR/C.07-08 日期工序操作者巡检员 异常描述 判定结果□合格品□不良品□废品□返工品 原因分析 是否需要制定措施□是□否 改进措施 品质异常记录表 QR/C.07-08 日期工序操作者巡检员 异常描述 判定结果□合格品□不良品□废品□返工品 原因分析 是否需要制定措施□是□否 改进措施

生产过程中异常处理规定

文件修(制)订履历 N0. 版次修(制)订日期修(制)订内容拟制人1 1.0 2013-04-22 首次发布杨雨风 文件发放范围及份数(在“( )”中打“√”表示需分发的单位,在“[ ]”中填写该单位发放文件份数): ( √ ) 总经办 [ 1 ] ( √ ) 品质部 [ 1 ] ( √ ) 工程技术部 [ 1 ] ( √ ) 物控部 [ 1 ] ( √ ) 制造部 [ 1 ] ( ) 营销部 [ ] ( ) 财务部 [ ] ( ) 人力资源部 [ ] ( √ ) 文控中心 [ 1 ] ( ) 设备部 [ ] ( ) 其他: [ ] 拟制杨松日期2013-4-21 审核日期 批准日期

1.目的: 为更加规范生产现场发生异常时,能及时准确地反映并能通过相关人员确认、分析、及时解决,确保生产顺利进行特制订此规定 2.范围: 适用公司生产过程中所有生产线上发生的品质异常现象 3.定义: IPQC-----制成检验控制 PQC------Process Quality Control (制造线品质控制)。 PE-------Process Engineer(制造工艺工程师)。 4.职责: 4.1品质部:IQPC或PQC发现的生产异常,由品质IPQC进行异常处理单的开具并由上级主管审核。同时负责跟进改善结果及效果确认 4.2生产部:产线管理人员负责对自行发现及品质开具的异常事项的确认,产线技术员对异常进行初步分析与处理,无法自行处理解决时,以联络单方式开具给工程PE工程师 4.3工程部:负责生产线上异常分析,找出异常原因,提出改善对策。并制定长期预防措施. 4.4物控部:负责及时将因生产物料,设备引起异常的相关信息反馈给供应商,监督供应商落实对异常处理的决议; 并负责因生产异常而导致的交期延后同营销部的沟通和确认; 5.作业程序 5.1产线员工在作业中如发现品质异常的产品,应立即通知组长,再由组长通知品质IPQC进行判定,制造部车间技术人员,进行初步的分析,与解决。在车间技术人员无法处理时,则应依品质开具的品质异常单开具《生产异常处理联络单》通知工程部协助处理。 5.2工程部到达现场后依据品质部开具的品质异常单(包含异常的具体信息)及不良实物,结合实际情况,进行分析,并给出解决方案。需相关部门协同解决生产异常的,由工程部电话通知各部门现场共同解决或召开现场会。 5.3当工程部PE工程师通知相关人员时,被通知人员在上班期间应30分钟内赶到事发现场(如遇特殊情况应告知可以到达的时间或可以代行决策的人员,原则上不可以超过45分钟),如部门负责人不能及时赶到现场的,应在规定时间内派人到场,并参照以下程序进行处理: A.立即对所发异常按照“人机料法环”五个方面进行调查分析,查找异常原因; B.立即判断出问题的严重程度和其可能的影响程度,如事态严重由工程部召开现场会并汇报上级领导; C.找出发生异常的原因,立即采取措施,消除异常,防止事态继续扩大; D.落实相关参与处理部门责任。并对品质异常单进行填写,在实际异常得到解决后当天,品质部对参与部门进行完整《品质异常单的》文件的分发. 5.4相关部门在接到《生产异常处理联络单》后应立即了解情况,并分以下情况进行处理: A.品质异常:由品质部负责对异常的发现与开具品质异常单(全员品质,全员都可以发现品质异常),车间技术员能自行分析与解决的由车间技术员处理,车间技术员无法处理的品质异常时,则由异常车间以联络单方式通知工程部协助处理。工程部PE工程师给出分析原因,改善对策,同时在三方统一方案后,以工程改善对策,交生产执行,由品质监督。进行改善。同时在PE工程师无法处理时,则由工程部主管对异常情况进行分析及处理,同时上报至工程部经理。必要时组织相关部门开会讨论解决; B.设备异常:由车间设备维护人员或与相关人员一起对设备进行维修,维修完成后由生产车间责任人签署维修结果; C.物料异常:由物控部根据实际情况,调整生产计划,必要时组织相关部门开会讨论解决。 5.5如果出现严重异常时生产部主管应根据事故解决的可能性作出暂时停产或转产的决定; 5.6对可能影响生产进度的情况,由车间管理人员在异常发生后需以电话通知或在《生产异常处理联络单》注明知会物控部,物控部应按实际情况采取应急措施调整生产计划,对受影响交货的订单需及时通知销售部。 5.7 异常处理结束后,由承接部门印发《生产异常处理联络单》给相应部门,各负责人必须在承诺的时间内完成各部门应完成的事项。 5.8由于人为因素所造成的生产异常时,相关部门主管需对相关人员进行加强培训。 5.9生产恢复正常后,工程部应会同品质部、物控部应对异常问题在五个工作日内进行深层次的原因分析,并制定长期有效的预防措施,杜绝同样异常的再次发生。

品质异常处理流程及方法

品质异常处理流程及方法 摘要:品质人员的工作职责之一就是要及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果,保证只有合格的产品才能转入下一道工序,生产出高质量的产品. 品质人员的工作职责 1、熟悉所控制范围的工艺流程 2、来料确认 3、按照作业指导书规定进行检验(首检、巡检) 4、作相关的质量记录 5、及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果 6、特殊产品的跟踪及质量记录 7、及时提醒现场对各物料及成品明显标识,以免混淆 8、及时纠正作业员的违规操作,督促其按作业指导书作业 9、对转下工序的产品进行质量及标识进行确认 品质异常可能发生的原因 生产现场的品质异常主要指的是在生产过程中发现来料、自制件批量不合格或有批量不合格的趋势。品质异常的原因通常有: A. 来料不合格包括上工序、车间的来料不合格 B. 员工操作不规范,不按作业指导书进行、新员工未经培训或未达到要求就上岗 C. 工装夹具定位不准 D. 设备故障 E. 由于标识不清造成混料 F. 图纸、工艺技术文件错误。 品质异常一般处理流程 1、判断异常的严重程度(要用数据说话) 2、及时反馈品质组长及生产拉长并一起分析异常原因(不良率高时应立即开出停线通知单) 3、查出异常原因后将异常反馈给相关的部门 (1)来料原因反馈上工序改善 (2)人为操作因素反馈生产部改善 (3)机器原因反馈设备部 (4)工艺原因反馈工程部 (5)测量误差反馈计量工程师 (6)原因不明的反馈工程部 4、各相关部门提出改善措施,IPQC督促执行 5、跟踪其改善效果,改善OK,此异常则结案,改善没有效果则继续反馈 怎样做才能尽可能的预防品质异常 SPC是一款专门分析品质异常的工具,它主要是应用统计分析技术对项目过程进行实时监控,区分出过程中

品质异常处理流程及方法

品质异常处理流程及方法Last revision on 21 December 2020

品质异常处理流程及方法 摘要:品质人员的工作职责之一就是要及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果,保证只有合格的产品才能转入下一道工序,生产出高质量的产品. 品质人员的工作职责 1、熟悉所控制范围的工艺流程 2、来料确认 3、按照作业指导书规定进行检验(首检、巡检) 4、作相关的质量记录 5、及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果 6、特殊产品的跟踪及质量记录 7、及时提醒现场对各物料及成品明显标识,以免混淆 8、及时纠正作业员的违规操作,督促其按作业指导书作业 9、对转下工序的产品进行质量及标识进行确认 品质异常可能发生的原因 生产现场的品质异常主要指的是在生产过程中发现来料、自制件批量不合格或有批量不合格的趋势。品质异常的原因通常有: A. 来料不合格包括上工序、车间的来料不合格 B. 员工操作不规范,不按作业指导书进行、新员工未经培训或未达到要求就上岗 C. 工装夹具定位不准 D. 设备故障 E. 由于标识不清造成混料 F. 图纸、工艺技术文件错误。

品质异常一般处理流程 1、判断异常的严重程度(要用数据说话) 2、及时反馈品质组长及生产拉长并一起分析异常原因(不良率高时应立即开出停线通知单) 3、查出异常原因后将异常反馈给相关的部门 (1)来料原因反馈上工序改善 (2)人为操作因素反馈生产部改善 (3)机器原因反馈设备部 (4)工艺原因反馈工程部 (5)测量误差反馈计量工程师 (6)原因不明的反馈工程部 4、各相关部门提出改善措施,IPQC督促执行 5、跟踪其改善效果,改善OK,此异常则结案,改善没有效果则继续反馈 怎样做才能尽可能的预防品质异常 是一款专门分析品质异常的工具,它主要是应用统计分析技术对项目过程进行实时监控,区分出过程中的随机波动与异常波动,了解每个工序有可能出现的品质异常、了解哪些工位容易出品质异常,从而对过程的异常趋势提出预警,以便及时采取措施,消除异常,恢复稳定,从而达到稳定过程,提高和控制质量的目的.

[重点]设备异常处理流程及规定

[重点]设备异常处理流程及规定 设备异常处理流程 序流程图责任人表单作业内容号 班组长/线长不能处生产异常出现时,生产部门/设备生产异常理或异常会导致停产时间超过30分钟 1 相关部门/ 时,应立即上报,或开出《生产异常发现者报告单》进行处理。 生产部负责人接到报告后应在10分钟生产部门/内赶赴现场;必要时可同时通知相关相关人员 2 相关部门/ 部门负责人,相关部门负责人接到通赶赴现场负责人知后应在10分钟内赶到现场( 相关部门负责人到达现场后立即对异相关部门异常分析 3 常进行分析,若部门负责人不能到场负责人应在10分钟内派人到达现场( 如不能立即处理应作出是否停产的意确定是总经办/总4 见,并注明预计恢复生产的时间(停否停产经理产应由总经理批准( 相关部门负责人针对问题应在30分钟制定应急相关部门生产异常 5 内制定出应急处理措施,制定措施时处理措施负责人报告单应尽可能地降低影响生产部门生产异常生产部门按应急措施进行生产按照处理6 负责人报告单调整生产措施生产 生产部/品 质部 NG 应急措施的有效性由生产部与品质部生产异常责任人措施7 共同验证,如验证不符合则重新制定报告单验证相关措施( YES 验证结果符合生产及品质相关要求,生产部负责恢复正8 可以在恢复生产后由品质部和生产部人常生产对异常进行跟进确认(

相关责任部生产恢复正常后相关部门应对问题的生产异常 9 制定长期门深层次的原因加以分析,并在两个工报告单预防措施负责人作日内制定出长期预防措施( 生产部生产异常生产部应协同品质部对责任部门的长10 负责人报告单期预防措施执行结果进行跟踪预防措施跟踪 异常处理规定 1(目的 为了更好的规范和完善公司生产异常处理作业,使生产问题发生后,各部门人员迅速、有效的处理,减免停工时间,提高生产效率,特制定本流程。 2(适用范围 适用于公司所有生产异常的处理。 3(职责 3(1 生产部门负责生产异常的反馈和处理措施验证。 3(2 品质部负责品质异常的处理及验证。 3(3 设备组负责设备异常的处理。 3(4 计控部负责物料异常的处理。 3(5 技术部负责技术、关键工序设备、工装模具、工艺异常的处理。 4(作业规范 4.1 生产异常反馈 4.1.1 当生产发生异常或有出现异常的趋势时,生产部发现人员和现场管理人员(如班组长)应即时给予分析,并主动积极寻求解决方法,包括与相关人员联系,如能及时解决则不在本流程规定内。

品质异常处理流程及方法

品质异常处理流程及方法 This manuscript was revised on November 28, 2020

品质异常处理流程及方法 摘要:品质人员的工作职责之一就是要及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果,保证只有合格的产品才能转入下一道工序,生产出高质量的产品. 品质人员的工作职责1、熟悉所控制范围的工艺流程2、来料确认3、按照作业指导书规定进行检验(首检、巡检)4、作相关的质量记录5、及时发现反馈生产中的品质异常状况,并督促现场执行改善措施、追踪其改善效果6、特殊产品的跟踪及质量记录7、及时提醒现场对各物料及成品明显标识,以免混淆8、及时纠正作业员的违规操作,督促其按作业指导书作业9、对转下工序的产品进行质量及标识进行确认 品质异常可能发生的原因 生产现场的品质异常主要指的是在生产过程中发现来料、自制件批量不合格或有批量不合格的趋势。品质异常的原因通常有:A. 来料不合格包括上工序、车间的来料不合格 B. 员工操作不规范,不按作业指导书进行、新员工未经培训或未达到要求就上岗C. 工装夹具定位不准 D. 设备故障E. 由于标识不清造成混料 F. 图纸、工艺技术文件错误。 品质异常一般处理流程1、判断异常的严重程度(要用数据说话)2、及时反馈品质组长及生产拉长并一起分析异常原因(不良率高时应立即开出停线通知单)3、查出异常原因后将异常反馈给相关的部门(1)来料原因反馈上工序改善(2)人为操作因素反馈生产部改善(3)机器原因反馈设备部(4)工艺原因反馈工程部(5)测量误差反馈计量工程师(6)原因不明的反馈工程部4、各相关部门提出改善措施,IPQC督促执行5、跟踪其改善效果,改善OK,此异常则结案,改善没有效果则继续反馈 怎样做才能尽可能的预防品质异常 是一款专门分析品质异常的工具,它主要是应用统计分析技术对项目过程进行实时监控,区分出过程中的随机波动与异常波动,了解每个工序有可能出现的品质异常、了解哪些工位容易出品质异常,从而对过程的异常趋势提出预警,以便及时采取措施,消除异常,恢复稳定,从而达到稳定过程,提高和控制质量的目 的.

品质异常处理操作规范

品质异常处理操作规范集团公司文件内部编码:(TTT-UUTT-MMYB-URTTY-ITTLTY-

品质异常处理流程 文件编号:AW-QR-PZ003-2017 拟制:孟非非日期:2017年4月21日 审核:日期:2017年4月*日 品质异常处理流程 1.目的: 为规范质量文件体系,提高产品的可追塑性,更效的解决异常问题的重复发生,明确质量异常问题的处理流程,特制定此文件 2.范围: 公司质量体系所要求的第三阶文件记录表单,《品质异常处理单》、《不合格品处理单》、《纠正和预防措施单》等。公司各组织部门管理负责人及涉及人员 3.说明 A.品质异常内容属于内部异常时要求对原因分析及临时解决措施在4小时内给予答复, 永久措施和需要与客户、供应商进行沟通的最长可延长2个工作日 B.品质异常分为四级 缺陷:未满足与预期或规定用途有关的要求 A级致命缺陷影响安全的所有缺陷,会影响使用寿命的,造成产品失效故障的,造成产品组装困难的,造成下道工序混乱的缺陷难以纠正的情况都为致命缺陷 B级重大缺陷可能影响使用寿命的,易于修复的故障,对产品组装肯定会造成困难的,外观难以接受的,给下道工序造成较大困难的易于纠正的情况都为重大缺陷 C级一般缺陷不会影响产品的运行或运转,不会造成故障的起因,对外观影响较大,会对下道工序影响较大的,可能影响装配的情况都为一般缺陷

D级轻微缺陷对产品外观有影响,可能对下道工序有影响,其它方面不涉及有产品缺陷的情况都为轻微缺陷 C.三不原则 不生产不良品不流出不良品不接受不良品 D.四不放过原则 事故原因未查清不放过 事故责任人未受到处理不放过 事故责任人和相关人员未受到教育培训不放过 事故制订的整改措施没有落实不放过 4.职责 品质部对品质异常进行判定,并开出品质异常处理单 各责任部门对品质异常进行原因分析及提出纠正预防措施 品质部对评审结果进行综合判定给出最终判定结果,对让步接收的需由质量主管领导批准,需要时由总经理批准 品质部对不合格品的让步及纠正预防措施进行跟踪评价 5.流程 a)表头/异常描述栏 当生产品质异常发生时检验员依据实际情况填写品质异常处理单,表头部分和异常描述栏由检验员进行填写 b)检验员勾选异常来源属于哪一环节并填写相关数量 c)涉及外协采购时需写明供应商及订单号以便准确记录质量信息 d)在异常描述时写发现的客观现象,不能主观臆断。一般采作六何法来描述即何人何 时何地何物何法何因

中断异常处理流程

计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。 1.异常中断响应和返回 系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作: 1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 2) 将CPSR复制到相应的SPSR中。 3) 根据异常类型,强制设置CPSR的运行模式位。 4) 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。 这些工作是由ARM 内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。 2) 将SPSR复制回CPSR中。 3) 若在进入异常处理时设置了中断禁止位,要在此清除。 这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器

发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 2.异常处理程序设计 2.1 异常响应流程 由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。 三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码: HandlerXXX sub sp,sp,#4 ;减少sp,保存跳转地址 stmfd sp!,{r0} ;将工作寄存器压入堆栈 ldr r0,=HandleXXX ;将HandleXXX地址放入r0 ldr r0,[r0] ;将中断程序入口地址放入r0 str r0,[sp,#4] ;将中断程序入口地址压入堆栈 ldmfd sp!,{r0,pc} ;将工作寄存器和中断程序入口地址弹出到r0和PC

生产异常处理作业程序

1、目的: 为生产线出现异常时的处理方法提供指导,包括异常发生与解决、内部检讨、原因调查、产品质量的持续改进,减少批量问题产生,以确保生产顺利高效运行. 2、使用范围:本公司生产过程中异常发生时。 3、职责: 一线员工:负责产线的设备点检/药水参数/产品自检发生的异常反馈。 领班:负责处理简单问题的异常反馈处理、确认操作和参数是否异常; 临时改善对策提供; 主管:负责一般问题的异常反馈处理,组织分析原因、临时改善对策提供; 经理:负责重大问题的异常反馈处理,组织分析,临时改善对策提供、改善过程跟进以及异常对策的执行。 4、定义: 简单问题: 员工自检发现的偶尔产品缺陷、首板不合格、轻微设备点检/药水参数异常但不至于引起产品报废和设备停产维修的 一般问题: 员工自检发现的连续3片产品缺陷、首板连续3次不合格、引起产品报废和设备点检发现异常会引起设备停产的 严重问题: 品保部连续3批抽检不合格(同一产品、同一坏点、同一班次)且属性能不良问题(例如镀铜空洞,尺寸NG等); 生产发生批量质量异常:每批板超过2Panel报废的; 生产要素不满足,如机器故障、模具故障、缺料等无法满足正常生产,造成停线2小时以上。 5、异常问题反馈处理流程: 5.1严重问题处理 处理时限:严重问题处理时限为2小时,2小时无解决办法或无法改善至正常生产状态的,升级到营运总监处理并知会计划部。 5.2 流程: 5.2.1 当发生严重问题时生产主管应立即通知工艺或相关部门,报告经理并到现场,对问题初步分析。 生产经理必须立即对问题分析并直接处理,召集相关部门人员讨论商谈解决措施,并将处理结论措施下达到各相关执行部门。2小时无法解决的立即升级到营运总监处理,以便公司采取相应对策; 5.2.2 当品保部连续3批检查不合格,主管必须向经理报告,分析原因,排查故障,如故障排除后恢复生产,确认问题得到解决的才能批量生产。 5.3一般问题处理时限: 一般问题处理时限为2小时,2小时内无解决办法或无法改善至正常生产状态的,需升级到经理处理并知会计划部。 5.3.1处理流程: 当一般问题出现时,工序领班或员工应立即停止放板,马上通知主管处理,主管应进行初步分析问题产生原因,同工艺人员到现场进行分析确认,初步分析为:

生产异常问题反馈流程图

生产异常反馈处理流程 1.目的 为及时有效的处理生产中发生的问题,以减少效率损失,提高生产力,特制定本办法。2. 适用范围 本公司生产过程中异常发生时,除另有规定外,均依本办法处理。 3.职责 生产部门:负责生产异常问题信息的采集,确认,反馈及验证改善纠正措施。异常问题的汇总 品保部:确认物料异常问题,监督技术人员处理解决过程,确认改善措施的有效性以及闭环处理。 工程部:负责对生产异常问题的处理,解决。 4. 生产异常报告单 4.1. 定义 本办法所指的生产异常,系指造成制造部门停工或生产进度延迟的情形,由此造成之无效工时,可称为异常工时.生产异常一般指下列异常: (1) 生产异常:因制程中操作不当导致的异常。 (2) 设备异常:因设备故障或水,气,电等原因而导致的异常。 (3) 品质异常:因制程中发生,发现品质问题而导致的异常。 (4) 技术异常:因产品设计或其他技术问题而导致的异常。 4.2. 生产异常报告单内容 发生生产异常,即有异常工时产生,不能快速的解决时,应填具《生产异常问题反馈表》。其内容一般应包括以下项目: (1)填表部门:由异常发生部门填写。 (2)生产产品:填具发生异常时正在生产的产品之名称,规格,型号。

(3)发生日期:填具发生异常日期。 (4) 异常发生部门:填具发生异常部门名称。 (5) 应用项目:填具发生异常产品的使用项目。 (6) 异常描述:填具发生异常之详细状况,尽量用量化的数据或具体的事实来陈述。 (7) 临时对策:由异常发生之部门和责任部门共同对策临时应争措施。 (8) 责任部门对策(根本对策):由责任部门填具对异常之处理对策。 4.3. 使用流程 (1) 异常问题产生记收集; (2) 生产人员发现异常问题并及时提出反馈,包括物料、生产过程以及成品出货各个环 节的异常信息; (3) 生产中出现异常反馈上报到部门主管判定是否需要填写《生产异常问题反馈表》; (4) 部门主管对异常初步分类并通知相应部门,前来研拟对策加以处理,并报告直属上 级。若异常已造成停产,相关责任部门必须在接到通知5分钟内派人到现场处理; (5) 接收部门对问题初步分析整理并判定责任部门,并判定问题是否可控; (6) 异常问题可控生产部门会同工程部﹑品保部采取异常之临时应急对策并加以执行, 以降低异常的影响; (7) 异常问题不完全可控,上报部门负责人进行审核确认; (8) 不完全可控(不可控)时相关责任部门分析确定根本原因,提出临时纠正措施和长 期预防措; (9) 责任部门组织相关部门对方案进行评审; (10)评审通过的方案反馈生产部门,生产部门进行方案实施和验证; (11)技术人员和质检员跟踪措施实施情况,并验证其有效性 (12) 方案实施效果确认有效可行后,工程部对纠正预防措施实施标准化以防止异常重复 发生;

制程异常处理操作规范

1.目的 规定当制程出现异常时的处理流程及各相关部门的责任,使异常能够得到及时解决,确保生产正常运行。 2.适用范围 适用于制程出现异常时的处理。 3.定义: 无。 4.职责 4.1各生产车间:当生产过程中制程出现异常时发出《不合格品报告单》通知IPQC 4.2 品质部IPQC:对制程异常现象进行确认,并通知QE或PE来现场进行原因分析和处理 4.3品质部QE:对制程异常进行原因分析并确认责任部门,并对责任部门制订的改善对策进行验证 4.4工程部PE:对功能及结构性制程异常进行原因分析并确认责任部门 4.5责任部门:负责制定异常的临时对策和永久对策并实施。 5.作业程序 5.1制程异常发出的时机: 5.1.1 当同一不良现象重复出现且不良率超出备损率时; 5.2 制程异常的发出、确认及通知: 5.2.1由车间生产线根据不良现象和事实填写《不合格品报告单》,填写内容包括:订单号、产品型号、生产数量、不良数量、不良率、提出部门、提出时间、订单交期、不良现象描述。 经车间主管(经理)审核后给车间IPQC确认; 5.2.2 IPQC在收到车间发出的《不合格品单》后,对异常现象、不良数量、不良率进行确认,并将确认结果填写在“IPQC确认”栏。如果确认结果与车间填写的内容不相符时,可退回 车间重新填写。 5.2.3 IPQC确认后以电话形式通知以下人员到发生异常的现场进行原因分析:5.2.3.1 如果是外观异常,电话通知制程QE工程师到现场进行原因分析; 5.2.3.2如果是功能和结构性异常,电话通知QE工程师和工程部PE工程师到现场进行原因分析; 5.2.3.3如果电话联络不到相关产品的QE工程师或PE工程师时应通知其直接上司做出相应安排。 5.3原因分析: 5.3.1制程QE工程师和PE工程师接到通知后,应在第一时间到异常发生的车间现场进行确认和原因分析。 5.3.2问题分析时应运用5WHY、5M1E、8D、QC七大手法、IE手法等问题分析技术分析

品质异常处理操作规范

品质异常处理操作规范 The latest revision on November 22, 2020

品质异常处理流程 文件编号:AW-QR-PZ003-2017 拟制:孟非非日期:2017年4月21日 审核:日期:2017年4月*日 品质异常处理流程 1.目的: 为规范质量文件体系,提高产品的可追塑性,更效的解决异常问题的重复发生,明确质量异常问题的处理流程,特制定此文件 2.范围: 公司质量体系所要求的第三阶文件记录表单,《品质异常处理单》、《不合格品处理单》、《纠正和预防措施单》等。公司各组织部门管理负责人及涉及人员 3.说明 A.品质异常内容属于内部异常时要求对原因分析及临时解决措施在4小时内给予 答复,永久措施和需要与客户、供应商进行沟通的最长可延长2个工作日 B.品质异常分为四级 缺陷:未满足与预期或规定用途有关的要求 A级致命缺陷影响安全的所有缺陷,会影响使用寿命的,造成产品失效故障的,造成产品组装困难的,造成下道工序混乱的缺陷难以纠正的情况都为致命缺陷B级重大缺陷可能影响使用寿命的,易于修复的故障,对产品组装肯定会造成困难的,外观难以接受的,给下道工序造成较大困难的易于纠正的情况都为重大缺陷 C级一般缺陷不会影响产品的运行或运转,不会造成故障的起因,对外观影响较大,会对下道工序影响较大的,可能影响装配的情况都为一般缺陷

D级轻微缺陷对产品外观有影响,可能对下道工序有影响,其它方面不涉及有产品缺陷的情况都为轻微缺陷 C.三不原则 不生产不良品不流出不良品不接受不良品 D.四不放过原则 事故原因未查清不放过 事故责任人未受到处理不放过 事故责任人和相关人员未受到教育培训不放过 事故制订的整改措施没有落实不放过 4.职责 品质部对品质异常进行判定,并开出品质异常处理单 各责任部门对品质异常进行原因分析及提出纠正预防措施 品质部对评审结果进行综合判定给出最终判定结果,对让步接收的需由质量主管领导批准,需要时由总经理批准 品质部对不合格品的让步及纠正预防措施进行跟踪评价 5.流程 a)表头/异常描述栏 当生产品质异常发生时检验员依据实际情况填写品质异常处理单,表头部分和异常描述栏由检验员进行填写 b)检验员勾选异常来源属于哪一环节并填写相关数量 c)涉及外协采购时需写明供应商及订单号以便准确记录质量信息 d)在异常描述时写发现的客观现象,不能主观臆断。一般采作六何法来描述即 何人何时何地何物何法何因 e)检验员在完成异常描述后通知责任部门负责人签字确认异常发生

相关文档
最新文档