List comprehension filter expressions not throwing exceptions

Sam Bobroff sam@REDACTED
Thu Sep 30 06:43:35 CEST 2010

Hi all,

I've discovered (after some rather painful debugging) that badrecord
exceptions (and others, actually) are sometimes silently converted to
false when they're generated inside a list comprehension filter
expression (as if they were a guard?).

I couldn't find any reference to this behaviour in the manual, so
perhaps it's a bug or perhaps there needs to be a note in the manual. It
certainly surprised me.

Here's some code to reproduce the behaviour:

-export([a/0, b/0]).
-record(rec, {x}).

a() ->
	[E || E <- [1], E#rec.x =:= 1].

b() ->
	[E || E <- [1], check_element(E)].

check_element(E) ->
	E#rec.x =:= 1.

Tested on R13B04, R14A or R14B, I get:

$ erl
Erlang R14A (erts-5.8) [source] [smp:2:2] [rq:2] [async-threads:0]
[hipe] [kernel-poll:false]

Eshell V5.8  (abort with ^G)
1> c(lc).
2> lc:a().
3> lc:b().
** exception error: {badrecord,rec}
     in function  lc:check_element/1
     in call from lc:'-b/0-lc$^0/1-0-'/1

Where I would expect both a() and b() to crash with badrecord. As the
code shows, executing the same expression wrapped in a function call
*does* cause the exception to be raised, so it's not as simple as all
exceptions being converted.

Sam Bobroff | sam@REDACTED | M5 Networks
Why does my email have those funny headers? Because I use PGP to sign
my email (and you should too!): that's how you know it's really from me.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: OpenPGP digital signature
URL: <>

More information about the erlang-questions mailing list