# bottomrule not working in a self-made environment

I have this environment for consistent tables in my LaTeX documents:

\newenvironment{defaultTable}[2] {
\@float{table}[h]
\noindent
\tabularx{\textwidth}{#1}
\specialrule{0.5pt}{10pt}{0pt}
\rowcolor[gray]{.9}
\gdef\mycaption{#2}
} {
\bottomrule
\endtabularx
\emph{\caption{\mycaption}}
\end@float
}

Unfortunately, the line with \bottomrule leads to this error, which i don't understand:

! Misplaced \noalign. \bottomrule
->\noalign
{\ifnum 0=`}\fi \@aboverulesep =\aboverulesep
\global... l.27 \end{defaultTable}

When I use it inside the environment it works though

\begin{defaultTable}{X X}{Blablah Table}
(..)
\bottomrule
\end{defaultTable}

What am I doing wrong?

-

This error can be avoided by using the environ package. For example, here's a working modifiation of your code using \NewEnviron of that package:

\documentclass{article}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{environ}
\makeatletter
\NewEnviron{defaultTable}[2] {
\@float{table}[h]
\noindent
\tabularx{\textwidth}{#1}
\specialrule{0.5pt}{10pt}{0pt}
\rowcolor[gray]{.9}
\gdef\mycaption{#2}
\BODY
\bottomrule}[
\endtabularx
\emph{\caption{\mycaption}}
\end@float
]
\makeatother
\begin{document}

\begin{defaultTable}{X X}{Test Table}
1 & 2 \\
\end{defaultTable}

\end{document}

Note: either end also the last row by \\ (or do it after \BODY). (In the original environment definition \\ before \bottomrule doesn't help.)

-
Could you explain why this error occurs and why \BODY fixes it? I had the same problem. –  macmadness86 Apr 13 at 13:52