```python
def fill_template(template, values):
    if not isinstance(template, str):
        raise ValueError("fill_template expects a string template")

    result = []
    i = 0
    while i < len(template):
        if template[i] == "{":
            end = template.find("}", i)
            if end == -1:
                raise ValueError("unterminated placeholder")
            name = template[i + 1:end]
            if not name or not all(c.isalnum() or c == "_" for c in name):
                raise ValueError("invalid placeholder name")
            if name not in values:
                raise ValueError(f"unknown name: {name}")
            result.append(str(values[name]))
            i = end + 1
        else:
            result.append(template[i])
            i += 1

    return "".join(result)
```