Files
c_soft/soft/exception.c

98 lines
1.6 KiB
C
Raw Normal View History

2024-06-18 19:37:43 +08:00
#include "setjmp.h"
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "string.h"
#include "stdarg.h"
#include "exception.h"
#include "mystdlib.h"
exception_def *exception(){
static exception_def frame={0};
return &frame;
}
void __throw(char *file,int line,const char *fmt,...){
exception_def *f=exception();
jmp_fram *h=f->jmp_head;
char *buff=0;
int length=0;
va_list args;
f->file=file;
f->line=line;
buff=f->log;
va_start(args, fmt);
length += vsnprintf(buff + length, THROW_LOG__MAX_SIZE - length - 1, fmt, args);
va_end(args);
longjmp((h->fram),1);
}
char *err_(){
exception_def *f=exception();
return f->log;
}
char *file_(){
exception_def *f=exception();
return f->file;
}
int line_(){
exception_def *f=exception();
return f->line;
}
void func_two();
int test_add(int a, int b)
{
printf("setjmp test.\n");
try_{
printf("first enter setjmp.\n");
try_{
printf("try in try.\n");
func_two();
// throw_("throw two err.");
}catch_{
printf("file=%s,line=%d,err=%s.\n",file_(),line_(),err_());
}
throw_("throw a err.");
}catch_{
printf("sssss\n");
printf("file=%s,line=%d,err=%s.\n",file_(),line_(),err_());
try_{
printf("try in catch.\n");
func_two();
// throw_("throw two err.");
}catch_{
printf("file=%s,line=%d,err=%s.\n",file_(),line_(),err_());
}
}
printf("setjmp end.\n");
return 0;
}
void func_two(){
printf("in func:%s\n",__func__);
void *p=mem_malloc(512);
throw_("throw in func_two. in func:%s",__func__);
mem_free(p);
}