Tratamento de Exceções na
Linguagem Go
Aluna:
Karla Polyana Silva Falcão
kpsf@cin.ufpe.br
Orientador:
Fernando J. Castor de Lima Filho
castor@cin.ufpe.br
Universidade Federal
de
Pernambuco
(UFPE)
Centro de Informática
(CIn)
Programação Concorrente
Programa Seqüencial em Go:
package main
import ("time";"fmt")
func a(msg string, sec int64){
time.Sleep(sec *1e9)
fmt.Println(msg)
}
func main(){
fmt.Println("Inicio...")
a("tea", 3)
a("coffee", 2)
time.Sleep(4e9)
fmt.Println("Fim...")
}
Programa Concorrente em Go:
package main
import ("time";"fmt")
func a(msg string, sec int64) {
time.Sleep(sec *1e9)
fmt.Println(msg)
}
func main(){
fmt.Println("Inicio...")
go a("tea", 3)
go a("coffee", 2)
time.Sleep(4e9)
fmt.Println("Fim...")
}
Problemas com Concorrência
#include <pthread.h>
#include <stdio.h>
int x=0;
void *f(void *threadid){
x++;
pthread_exit(NULL);
}
void *g(void *threadid){
x--;
pthread_exit(NULL);
}
int main (){
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, f, NULL);
pthread_create(&thread2, NULL, g, NULL);
printf("%dn",x);
pthread_exit(NULL);
}
 Linguagem C
Problema :
Indeterminismo
- Qual o valor final de “x”?
Solução :
Uso de semáforos, mutexes,
monitores, etc.
Concorrência em Go
package main
import ("fmt")
var x int = 0
var c = make(chan int)
func main(){
go f()
go g()
fmt.Println(<-c)
}
func f() {
x++
c<-x
}
func g() {
x--
c<-x
}
 Facilidade na criação de threads
(goroutines)
 Sincronização
 Sem dados compartilhados entre
threads (goroutines)
 Linguagem Go
Por que Go?
Go é uma linguagem de programação
criada pela Google em setembro de
2009. Já em 2010 alcançou a décima
sexta posição, no ranking da TIOBE
Programming Community.
Go tem foco na facilidade de
programação, desempenho e
escalabilidade em ambiente multi-core,
como é o mundo hoje em dia.
Tratando Erros em Go
(Erros = Exceções)
package main
import ("fmt")
func f(){
div := 9/0
}
func main() {
f()
}
FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
package main
import ("fmt")
func f(){
div := 9/0
}
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
f()
}
go f()
Tratando Erros em Go
(Erros = Exceções)
FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
Problema (1)
package main
import ("fmt")
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
go g() //Pode entrar em pânico!
go h() //Pode entrar em pânico!
}
 Se houver um erro não recuperado em uma
goroutine todas as outras no mesmo nível e
em níveis superiores morrem!
FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html
Problema (2)
package main
import ("fmt")
var c = make(chan int)
func f(){
time.sleep(3*1e9)
c<-x
}
func main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
<-c
}
FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html
 Não há sincronização implícita entre as
goroutines!
Resolvendo o problema
package main
import ("fmt")
var c = make(chan int)
func f(){
div := 9/0
}
safunc main() {
defer func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
}()
go f()
<-c
}
go func(){
if x:=recover();x!=nil{
fmt.Println(“Erro :”,x)
}
fmt.Println(“Tudo Ok!”)
f()
c<-1
}()
Modificação no front-end GCCGO
 Nova palavra reservada
- safunc ( Safe Function)
 Injeção de Código
- Função anônima com tratador
- Canal para a sincronização
http://kynas.blogs.sapo.pt/arquivo/2004_02.html
Referências e agradecimentos
Agradecimentos :
 À FACEPE e ao CNPq pelo financiamento da
pesquisa.
 Ao meu orientador.
Referências :
 Especificação da linguagem Go. End.:
www.golang.org.
 Comunidade que indica a popularidade de
linguagens de programação. End.:
http://www.tiobe.com/index.php/content/paperinf
o/tpci/index.html.

Tratamento de exceções em GO

  • 1.
    Tratamento de Exceçõesna Linguagem Go Aluna: Karla Polyana Silva Falcão kpsf@cin.ufpe.br Orientador: Fernando J. Castor de Lima Filho castor@cin.ufpe.br Universidade Federal de Pernambuco (UFPE) Centro de Informática (CIn)
  • 2.
    Programação Concorrente Programa Seqüencialem Go: package main import ("time";"fmt") func a(msg string, sec int64){ time.Sleep(sec *1e9) fmt.Println(msg) } func main(){ fmt.Println("Inicio...") a("tea", 3) a("coffee", 2) time.Sleep(4e9) fmt.Println("Fim...") } Programa Concorrente em Go: package main import ("time";"fmt") func a(msg string, sec int64) { time.Sleep(sec *1e9) fmt.Println(msg) } func main(){ fmt.Println("Inicio...") go a("tea", 3) go a("coffee", 2) time.Sleep(4e9) fmt.Println("Fim...") }
  • 3.
    Problemas com Concorrência #include<pthread.h> #include <stdio.h> int x=0; void *f(void *threadid){ x++; pthread_exit(NULL); } void *g(void *threadid){ x--; pthread_exit(NULL); } int main (){ pthread_t thread1, thread2; pthread_create(&thread1, NULL, f, NULL); pthread_create(&thread2, NULL, g, NULL); printf("%dn",x); pthread_exit(NULL); }  Linguagem C Problema : Indeterminismo - Qual o valor final de “x”? Solução : Uso de semáforos, mutexes, monitores, etc.
  • 4.
    Concorrência em Go packagemain import ("fmt") var x int = 0 var c = make(chan int) func main(){ go f() go g() fmt.Println(<-c) } func f() { x++ c<-x } func g() { x-- c<-x }  Facilidade na criação de threads (goroutines)  Sincronização  Sem dados compartilhados entre threads (goroutines)  Linguagem Go
  • 5.
    Por que Go? Goé uma linguagem de programação criada pela Google em setembro de 2009. Já em 2010 alcançou a décima sexta posição, no ranking da TIOBE Programming Community. Go tem foco na facilidade de programação, desempenho e escalabilidade em ambiente multi-core, como é o mundo hoje em dia.
  • 6.
    Tratando Erros emGo (Erros = Exceções) package main import ("fmt") func f(){ div := 9/0 } func main() { f() } FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
  • 7.
    package main import ("fmt") funcf(){ div := 9/0 } func main() { defer func(){ if x:=recover();x!=nil{ fmt.Println(“Erro :”,x) } fmt.Println(“Tudo Ok!”) }() f() } go f() Tratando Erros em Go (Erros = Exceções) FONTE: http://images.sodahead.com/polls/000628299/polls_panic_attack_5656_707107_answer_5_xlarge.jpeg
  • 8.
    Problema (1) package main import("fmt") func main() { defer func(){ if x:=recover();x!=nil{ fmt.Println(“Erro :”,x) } fmt.Println(“Tudo Ok!”) }() go f() go g() //Pode entrar em pânico! go h() //Pode entrar em pânico! }  Se houver um erro não recuperado em uma goroutine todas as outras no mesmo nível e em níveis superiores morrem! FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html
  • 9.
    Problema (2) package main import("fmt") var c = make(chan int) func f(){ time.sleep(3*1e9) c<-x } func main() { defer func(){ if x:=recover();x!=nil{ fmt.Println(“Erro :”,x) } fmt.Println(“Tudo Ok!”) }() go f() <-c } FONTE: http://kynas.blogs.sapo.pt/arquivo/2004_02.html  Não há sincronização implícita entre as goroutines!
  • 10.
    Resolvendo o problema packagemain import ("fmt") var c = make(chan int) func f(){ div := 9/0 } safunc main() { defer func(){ if x:=recover();x!=nil{ fmt.Println(“Erro :”,x) } fmt.Println(“Tudo Ok!”) }() go f() <-c } go func(){ if x:=recover();x!=nil{ fmt.Println(“Erro :”,x) } fmt.Println(“Tudo Ok!”) f() c<-1 }() Modificação no front-end GCCGO  Nova palavra reservada - safunc ( Safe Function)  Injeção de Código - Função anônima com tratador - Canal para a sincronização http://kynas.blogs.sapo.pt/arquivo/2004_02.html
  • 11.
    Referências e agradecimentos Agradecimentos:  À FACEPE e ao CNPq pelo financiamento da pesquisa.  Ao meu orientador. Referências :  Especificação da linguagem Go. End.: www.golang.org.  Comunidade que indica a popularidade de linguagens de programação. End.: http://www.tiobe.com/index.php/content/paperinf o/tpci/index.html.